ASP.NET GridView提交编辑后数据仍插入初始加载值问题求助
故障根因
该问题是ASP.NET Web Forms开发中的常见场景,核心原因是页面回发时未做判断重复绑定GridView,用户编辑的内容被初始数据覆盖:
页面事件执行顺序中,Page_Load事件优先级高于按钮点击事件,若GridView的初始绑定逻辑直接写在Page_Load中未加回发判断,点击提交按钮触发回发时,会先重新从数据库拉取初始数据覆盖用户编辑的内容,再执行插入逻辑,最终入库的自然还是初始值。
修复方案
- 调整Page_Load逻辑,仅首次加载页面时绑定GridView数据:
protected void Page_Load(object sender, EventArgs e) { // 仅非回发状态下绑定初始数据 if (!IsPostBack) { // 此处放置你原有的GridView绑定逻辑,示例如下: // GridView1.DataSource = GetDataFromDB(); // 从数据库拉取初始数据的方法 // GridView1.DataBind(); } }
- 可选优化:原代码的SQL拼接写法存在SQL注入风险,建议改为参数化查询,同时优化数据库连接的使用效率,修改后的提交逻辑参考:
protected void Submit_Data(object sender, EventArgs e) { // 连接对象提到循环外复用,避免重复创建销毁的性能开销 using (SqlConnection con = new SqlConnection(getConn())) { con.Open(); foreach (GridViewRow row in GridView1.Rows) { string insertSql = @"insert into test ([Sales Order Id],[input data],Material_Name,[Part Number],id,GL_Account) values (@SalesOrderId, @InputData, @MaterialName, @PartNumber, @Id, @GLAccount)"; using (SqlCommand com = new SqlCommand(insertSql, con)) { // 按需调整参数的类型和长度,以下为示例 com.Parameters.AddWithValue("@SalesOrderId", sales_order_id); com.Parameters.AddWithValue("@InputData", input_id); com.Parameters.AddWithValue("@MaterialName", row.Cells[0].Text); com.Parameters.AddWithValue("@PartNumber", row.Cells[1].Text); com.Parameters.AddWithValue("@Id", ((TextBox)row.FindControl("txtedit")).Text); com.Parameters.AddWithValue("@GLAccount", row.Cells[3].Text); com.ExecuteNonQuery(); } } } }
效果参考图:

内容的提问来源于stack exchange,提问作者Mrin
相关产品推荐
相关产品推荐

