2

我正在使用 C# 和 ASP.NET 开发一个 Web 应用程序。我通过同一页面中的文本框将数据绑定到gridview,并在“保存”按钮单击事件中编写了绑定方法。

button_click现在,一旦我刷新页面以通过“保存”事件将数据从文本框保存到网格视图,发现网格视图再次与重复行绑定,这真的很奇怪。我曾尝试在 Firefox、chrome 和 IE 8 上加载页面....但结果是否定的....

谁能让我知道为什么会发生并指导我解决它....

这是我的 C# 代码:

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

protected void Page_Load(object 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;
    }
}

任何人请帮助我.....提前谢谢..

4

2 回答 2

3

这是一个常见的问题。检查类似的 SO 问题:Webforms Refresh 问题如何停止不需要的回发

如果几句话,网络浏览器刷新按钮只是将最后一个请求发送到您的情况下的服务器 a "Save" button click event,因此它会给出重复的行。使用Response.Redirect,这样最后的请求将只是导航到页面,因此刷新不会造成不良影响。

已编辑

我看到你已经添加了一些代码。这是适合您的解决方法。您将数据保存到数据库这一事实有很大帮助。页面加载事件的第一件事无需检查页面是否为 IsPostBack,只需调用该bindassets("", "");方法即可。

至于保存按钮点击事件。无需调用bindassets("", "");它将从页面加载中调用。

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
}
于 2011-09-23T10:22:01.713 回答
0
if (!IsPostBack)
{
    Bind(); //bind data to grid
}
于 2011-09-23T10:03:32.707 回答