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
相关产品推荐
相关产品推荐

