如何在循环中仅更新用户修改的TextBox 不覆盖GridView中所有空值TextBox
问题根本原因
当前代码无差别遍历所有GridView行,无论用户是否修改对应行的TextBox内容,都会执行全量数据库更新操作。你的存储过程默认采用全字段覆盖更新逻辑,原本为NULL的CourseID字段会被当前TextBox提交的内容覆盖,再加上如果页面GridView绑定逻辑未做IsPostBack判断,就会出现所有原本为NULL的位置被自动填充的问题。
修复方案1:新旧值对比更新(推荐,无需额外事件触发)
你之前尝试值对比未生效,大概率是取值或对比逻辑有误,按照以下逻辑修改即可:
try { DataTable dtTmp = (DataTable)Session["dtTmp"]; foreach (GridViewRow row in gvEdit.Rows) { string Id = gvEdit.DataKeys[row.RowIndex].Value.ToString(); TextBox TbCourseEdit = row.FindControl("TbCourseEdit") as TextBox; // 计算当前用户输入对应的新CourseID int? newCourseId = int.TryParse(s.CourseNameToID(TbCourseEdit.Text).ToString(), out var courseId) ? courseId : (int?)null; // 从Session存储的原始数据中匹配对应行的旧CourseID DataRow[] matchedOldRows = dtTmp.Select($"ID = '{Id}'"); if(matchedOldRows.Length == 0) continue; int? oldCourseId = matchedOldRows[0]["CourseID"] == DBNull.Value ? null : (int?)matchedOldRows[0]["CourseID"]; // 仅当新旧值不一致时才执行更新 if(newCourseId != oldCourseId) { s.ID = Id; s.CourseID = newCourseId; s.ScheduleToMoodleTemplateSave(); } } MessageBox1.Message = "已保存修改内容"; } catch (Exception ex) { ApplicationLog.Write(ApplicationLog.logType.error, null, "ScheduleMoodleTemplate.SaveBulkEdit()", ex.Message); }
注意事项
- 确保
Session["dtTmp"]仅在页面首次加载时赋值,后续回发不会被意外覆盖 - 页面GridView的绑定逻辑必须放在
if(!IsPostBack)代码块中,避免回发时刷新控件值导致对比失效
修复方案2:优化更新逻辑避免全量覆盖(可选,搭配方案1更安全)
你当前的ScheduleToMoodleTemplateSave方法会强制更新所有字段,可修改为仅更新本次涉及的CourseID字段,避免其他字段被意外覆盖:
Hashtable ht = new Hashtable(); if (this.ID != null) { ht.Add("ID", this.ID); } ht.Add("MoodleTemplateID", this.MoodleTemplateID); ht.Add("ScheduleTypeID", this.ScheduleTypeID); ht.Add("DeliverTypeID", this.DeliverTypeID); // 仅当CourseID有赋值时才加入更新参数 if(this.CourseID.HasValue) { ht.Add("CourseID", this.CourseID); } try { SqlToolbox.SpExecuteInt(Config.connectionString, "ScheduleMoodleTemplateSave", ht); } catch { throw; }
同时需要同步修改存储过程ScheduleMoodleTemplateSave,增加判断逻辑:仅当传入@CourseID参数时才更新CourseID字段,否则保留数据库原有值。
TextChanged事件方案说明
如果你想使用TextChanged事件实现,需要给每个TextBox设置AutoPostBack="true"属性,在事件触发时将修改的行ID存入全局List,最终保存时仅更新List中的ID对应行即可。但该方案每次修改都会触发页面回发,用户体验不如值对比方案。
内容的提问来源于stack exchange,提问作者KiterCodes
相关产品推荐
相关产品推荐

