GridView新增记录时误更新旧记录技术求助
问题根源分析
你遇到的新增记录时误更新旧记录的问题,核心原因是**HiddenField1在编辑操作后没有被重置**:
- 当点击编辑按钮时,
GV_PRIOR_SelectedIndexChanging事件会把选中记录的ID存入HiddenField1,同时将保存按钮文本改为"UPDATE"。 - 但点击新增按钮时,你没有清空
HiddenField1的旧值,也没有重置表单控件状态,导致提交新增时,HiddenField1.Value仍然保留着之前编辑的记录ID,代码直接走了else分支的更新逻辑,而非新增逻辑。
另外还有两个细节问题需要修正:
- 存储过程
SAVEPRIOR的新增分支没有设置P_ACTIVE字段,会导致新增记录的该字段值为空,不符合业务逻辑。 - DAL层的数据库连接未用
using语句管理,存在连接泄漏风险。
修复方案
1. 新增按钮的点击事件处理
给新增按钮添加点击事件,重置表单状态,确保新增流程的初始状态正确:
protected void btn_addprior_Click(object sender, EventArgs e) { // 重置隐藏字段,确保新增时ID为空 HiddenField1.Value = ""; // 清空表单输入控件 tb_prioname.Text = ""; chk_actprior.Checked = false; // 修改保存按钮文本为新增模式 btn_savprior.Text = "SAVE"; }
(注意:要在ASPX页面中给新增按钮绑定该事件,比如设置OnClick="btn_addprior_Click")
2. 补全新增分支的P_ACTIVE字段(修改存储过程)
ALTER PROC [dbo].[SAVEPRIOR] @P_ID int, @P_NAME varchar(20), @P_ACTIVE char(1) AS BEGIN IF(@P_ID=0) BEGIN -- 新增时同时插入P_ACTIVE字段,保证数据完整性 INSERT INTO PRIORITY(P_NAME, P_ACTIVE) VALUES (@P_NAME, @P_ACTIVE) END ELSE BEGIN UPDATE PRIORITY SET P_NAME=@P_NAME,P_ACTIVE=@P_ACTIVE WHERE P_ID=@P_ID END END
3. 优化DAL层的连接管理(推荐)
使用using语句自动释放数据库连接,避免连接泄漏:
public void savePRIOR(int id, string priorname, bool actv ) { // using会自动释放SqlConnection和SqlCommand资源,无需手动关闭连接 using(SqlConnection con = new SqlConnection(你的数据库连接字符串)) using(SqlCommand cmd = new SqlCommand("SAVEPRIOR", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@P_ID", id); cmd.Parameters.AddWithValue("@P_NAME", priorname); cmd.Parameters.AddWithValue("@P_ACTIVE", (actv) ? "Y" : "N"); con.Open(); cmd.ExecuteNonQuery(); } }
4. 可选:优化提示脚本(避免布局问题)
原来的Response.Write可能会干扰页面布局,建议改用ClientScript.RegisterStartupScript:
protected void btn_savprior_Click(object sender, EventArgs e) { if (HiddenField1.Value == "") { bll.savprior(0, tb_prioname.Text, Convert.ToBoolean(chk_actprior.Checked)); ClientScript.RegisterStartupScript(this.GetType(), "saveSuccess", "<script>alert('Priority Saved Successfully')</script>"); } else { bll.savprior(Convert.ToInt16(HiddenField1.Value), tb_prioname.Text, Convert.ToBoolean(chk_actprior.Checked)); ClientScript.RegisterStartupScript(this.GetType(), "updateSuccess", "<script>alert('Priority Updated Successfully')</script>"); } bindgrid(); }
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

