You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在循环中仅更新用户修改的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:30:00