2 votes

L'événement de clic du bouton de sauvegarde est déclenché lors du rafraîchissement de la page une fois que la liaison des données à un gridview a été effectuée par le bouton de sauvegarde en asp.net.

Je travaille sur une application web utilisant C# et ASP.NET. Je lie les données à la grille par le biais des zones de texte dans la même page et j'ai écrit la méthode de liaison dans l'événement de clic du bouton "Save".

Maintenant, il est vraiment étrange de constater que la vue de la grille est liée à nouveau avec des lignes en double une fois que j'ai rafraîchi la page après avoir enregistré les données dans la vue de la grille à partir des zones de texte par le biais de "enregistrer". button_click événement. J'ai essayé de charger la page sur firefox, chrome et IE 8....mais le résultat est négatif.....

Quelqu'un peut-il me dire pourquoi cela se produit et me guider pour le résoudre ? ....

Voici mon code C# :

string con = ConfigurationSettings.AppSettings["ConnectionStrings"];

void protégé Page_Load(objet sender, EventArgs e) {

    tbladdasset.Visible = false;
    btnsaveasset.Enabled = false;
    lblErrMsg.Text = "";

    if (!IsPostBack)
    {
        bindassets("", "");
        ViewState["sortOrder"] = "";
    }
}

private void bindassets(string sortExp, string sortDir)
{
    try
    {
        SqlConnection con1 = new SqlConnection(con);
        con1.Open();
        SqlCommand cmd = new SqlCommand("select Description,CONVERT(VARCHAR(10), RecievedDate, 101) as DateRecieved,cost,Modelno,Quantity from Asset", con1);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        con1.Close();

        if (dt.Rows.Count > 0)
        {
            DataView dv = dt.DefaultView;

            if (sortExp != string.Empty)
            {
                dv.Sort = string.Format("{0} {1}", sortExp, sortDir);
            }

            grdvAssets.DataSource = dv;
            grdvAssets.DataBind();

        }
        else
        {
            lblErrMsg.Text = "No data found...";
        }

        btnsaveasset.Enabled = false;
        tbladdasset.Visible = false;
    }
    catch
    {
        lblErrMsg.Text = "Failed to connect server...";
    }
}

protected void btnaddnew_Click(object sender, EventArgs e)
{
    tbladdasset.Visible = true;
    btnsaveasset.Enabled = true;
    lblErrMsg.Text = "";
    txtdescription.Text = "";
    txtdtrecieved.Text = "";
    txtcost.Text = "";
    txtmodelno.Text = "";
    txtquantity.Text = "";
}

protected void btnsaveasset_Click(object sender, EventArgs e)
{
        if (txtdescription.Text != "" && txtdtrecieved.Text != "" && txtcost.Text != "" && txtmodelno.Text != "" && txtquantity.Text != "")
        {
            try
            {
                string desc= txtdescription.Text;
                DateTime dtrecd = Convert.ToDateTime(txtdtrecieved.Text);
                string cost = txtcost.Text;
                string modelno = txtmodelno.Text;
                double quantity = Convert.ToDouble(txtquantity.Text);
                SqlConnection sqlcon = new SqlConnection(con);
                sqlcon.Open();
                string save = "Insert into Asset(Description,Recieveddate,cost,Modelno,Quantity)values(@desc,@date,@cost,@modelno,@quantity)";
                SqlCommand cmd = new SqlCommand(save, sqlcon);
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@desc", desc);
                cmd.Parameters.Add("@date", dtrecd);
                cmd.Parameters.Add("@cost", cost);
                cmd.Parameters.Add("@modelno", modelno);
                cmd.Parameters.Add("@quantity", quantity);
                cmd.ExecuteNonQuery();
                sqlcon.Close();
                bindassets("", "");
                btnsaveasset.Enabled = false;
                txtdescription.Text = "";
                txtdtrecieved.Text = "";
                txtcost.Text = "";
                txtmodelno.Text = "";
                txtquantity.Text = "";
                lblErrMsg.Text = "data inserted successfully..";
            }
            catch
            {
                lblErrMsg.Text = "Please enter valid data and try again...";
            }
        }
        else
        {
            lblErrMsg.Text = "Please enter valid data and try again...";
        }

}

protected void grdvAssets_Sorting(object sender, GridViewSortEventArgs e)
{
    bindassets(e.SortExpression, sortOrder);
}

public string sortOrder
{
    get
    {
        if (ViewState["sortOrder"].ToString() == "desc")
        {
            ViewState["sortOrder"] = "asc";
        }
        else
        {
            ViewState["sortOrder"] = "desc";
        }

        return ViewState["sortOrder"].ToString();
    }
    set
    {
        ViewState["sortOrder"] = value;
    }
}

Quelqu'un peut-il m'aider ? .....Merci d'avance...

3voto

Niko G. Points 1505

C'est un problème courant. Vérifiez les questions similaires de SO : Problème de rafraîchissement des formulaires Web , Comment arrêter le postback non désiré .

si quelques mots, le bouton de rafraîchissement du navigateur web envoie juste la dernière requête au serveur dans votre cas c'est une "Save" button click event ce qui donne des lignes en double. utilisez Réponse.Redirection De cette façon, la dernière requête ne sera qu'une navigation vers la page, de sorte que l'actualisation ne provoquera pas d'effets indésirables.

EDITED

Je vois que vous avez ajouté du code. Voici une solution de contournement pour vous. Le fait que vous sauvegardez les données dans la base de données aide beaucoup. Tout d'abord, lors du chargement de la page, il n'est pas nécessaire de vérifier si la page est PostBack, il suffit d'appeler la fonction bindassets("", ""); méthode.

comme pour l'événement de clic du bouton d'enregistrement. il n'est pas nécessaire d'appeler l'élément bindassets("", ""); il sera appelé dès le chargement de la page.

protected void btnsaveasset_Click(object sender, EventArgs e)
{
        if (txtdescription.Text != "" && txtdtrecieved.Text != "" && txtcost.Text != "" && txtmodelno.Text != "" && txtquantity.Text != "")
        {
            try
            {
                string desc= txtdescription.Text;
                DateTime dtrecd = Convert.ToDateTime(txtdtrecieved.Text);
                string cost = txtcost.Text;
                string modelno = txtmodelno.Text;
                double quantity = Convert.ToDouble(txtquantity.Text);
                SqlConnection sqlcon = new SqlConnection(con);
                sqlcon.Open();
                string save = "Insert into Asset(Description,Recieveddate,cost,Modelno,Quantity)values(@desc,@date,@cost,@modelno,@quantity)";
                SqlCommand cmd = new SqlCommand(save, sqlcon);
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@desc", desc);
                cmd.Parameters.Add("@date", dtrecd);
                cmd.Parameters.Add("@cost", cost);
                cmd.Parameters.Add("@modelno", modelno);
                cmd.Parameters.Add("@quantity", quantity);
                cmd.ExecuteNonQuery();
                sqlcon.Close();
                //bindassets("", "");
                btnsaveasset.Enabled = false;
                txtdescription.Text = "";
                txtdtrecieved.Text = "";
                txtcost.Text = "";
                txtmodelno.Text = "";
                txtquantity.Text = "";
                lblErrMsg.Text = "data inserted successfully..";

            }
            catch
            {
                lblErrMsg.Text = "Please enter valid data and try again...";
            }
        }
        else
        {
            lblErrMsg.Text = "Please enter valid data and try again...";
        }
        Response.Redirect("nameofpage.aspx", false);//does a charm. browser refresh button will repeat last action and from now on that's a Response.Redirect("nameofpage.aspx", false). thus no duplicate records
}

0voto

huMpty duMpty Points 7921
if (!IsPostBack)
{
    Bind(); //bind data to grid
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X