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

C#中Infragistics WinForms UltraGrid绑定DataTable时,如何仅保留DataRow单个字段值?

解决Infragistics UltraGrid绑定DataTable时仅保留单个单元格值的问题

我完全懂你的困扰——想单独留住某一个单元格的修改,同时让其他单元格回到初始状态,但又不能用AcceptChanges()提交整行,毕竟那样会把所有修改都保存下来。在UltraGrid绑定DataTable的场景里,确实得用点针对性的技巧,下面给你两个实用的解决方案:


方案一:利用DataRow的版本机制手动恢复

DataRow本身维护了数据的原始版本和当前版本,我们可以先保存要保留的字段值,回滚整行后再把这个值重新赋值回去:

// 假设你要保留的是名为"ColumnA"的字段,当前操作的DataRow为targetRow
// 1. 先保存需要保留的字段值
var preservedValue = targetRow["ColumnA"];

// 2. 回滚整行,让所有字段回到初始状态
targetRow.RejectChanges();

// 3. 重新赋值要保留的字段
targetRow["ColumnA"] = preservedValue;

// (可选)如果需要让这个字段也标记为已提交状态(不再是Modified)
// 注意:这里调用AcceptChanges()会把整行标记为Unchanged,但其他字段本来就是初始值,所以不会有问题
// targetRow.AcceptChanges();

这个方法适合你在代码里主动修改字段值后,需要快速恢复其他字段的场景,逻辑简单直接。


方案二:通过UltraGrid的BeforeRowUpdate事件自动处理

如果是用户在UI上编辑单元格后离开行的场景,推荐用UltraGrid的BeforeRowUpdate事件来拦截更新,只保留目标字段的修改:

private void ultraGrid1_BeforeRowUpdate(object sender, CancelableRowEventArgs e)
{
    // 获取当前行对应的DataRowView
    var rowView = e.Row.ListObject as DataRowView;
    if (rowView == null) return;
    
    DataRow targetRow = rowView.Row;
    string preservedColumnName = "ColumnA"; // 替换成你要保留的列名

    // 遍历所有列,恢复非目标列的原始值
    foreach (DataColumn column in targetRow.Table.Columns)
    {
        if (column.ColumnName != preservedColumnName)
        {
            // 用原始版本的值覆盖当前值
            targetRow[column] = targetRow[column, DataRowVersion.Original];
        }
    }

    // 结束行编辑,确保修改生效
    e.Row.EndEdit();
}

这个事件会在用户离开行、UltraGrid准备提交行修改前触发,你可以在这里精准控制哪些字段保留修改,哪些恢复初始值,完全符合你的需求——既不会丢失目标单元格的值,也不会误提交其他字段的临时修改。


注意事项

  • 确保DataTable的EnforceConstraints属性设置为false(如果有外键约束的话),避免恢复值时触发约束错误。
  • 如果你的UltraGrid设置了批量编辑模式,可能需要调整事件触发的时机,优先用BeforeRowUpdate而非单元格级别的事件,这样能确保整行的处理逻辑统一。

内容的提问来源于stack exchange,提问作者Huzan Toorkey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:42:34