ASP.NET GridView删除行后其余行输入数据丢失问题求助
问题根因
你的新增行逻辑里会先把页面上所有文本框的最新输入同步到ViewState存储的DataTable后再做后续操作,但删除行逻辑漏掉了这个同步步骤:直接读取ViewState里存储的旧DataTable删除目标行后重新绑定,用户最新输入的未同步内容自然就清空了。
修复方案
替换你现有的Gridview1_SelectedIndexChanged方法代码即可,完整修改后的逻辑如下:
protected void Gridview1_SelectedIndexChanged(object sender, EventArgs e) { if (ViewState["CurrentTable"] == null) return; DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; // 第一步:先把当前页面所有行的最新输入同步到DataTable for (int i = 0; i < Gridview1.Rows.Count; i++) { TextBox box1 = (TextBox)Gridview1.Rows[i].Cells[1].FindControl("TextBox1"); TextBox box2 = (TextBox)Gridview1.Rows[i].Cells[2].FindControl("TextBox2"); TextBox box3 = (TextBox)Gridview1.Rows[i].Cells[3].FindControl("TextBox3"); dtCurrentTable.Rows[i]["Column1"] = box1.Text; dtCurrentTable.Rows[i]["Column2"] = box2.Text; dtCurrentTable.Rows[i]["Column3"] = box3.Text; } // 第二步:删除目标行 int deleteIndex = Gridview1.SelectedIndex; dtCurrentTable.Rows[deleteIndex].Delete(); dtCurrentTable.AcceptChanges(); // 可选:重置行号为连续序号,避免删除后行号跳号 for (int i = 0; i < dtCurrentTable.Rows.Count; i++) { dtCurrentTable.Rows[i]["RowNumber"] = i + 1; } // 第三步:更新ViewState并重新绑定 ViewState["CurrentTable"] = dtCurrentTable; Gridview1.DataSource = dtCurrentTable; Gridview1.DataBind(); // 第四步:回填所有行的输入值 SetPreviousData(); }
修改后删除行时会先保存所有用户已输入的内容,再执行删除操作,其余行的内容就不会丢失了。
内容的提问来源于stack exchange,提问作者Mehmet Akif
相关产品推荐
相关产品推荐

