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

DataGrid数据修改完成后适用事件处理器及最优方案咨询

适配当前场景的DataGrid事件选择

你当前在RowEditEnding事件中提取原始序列号的思路是可行的,这个事件触发时行编辑尚未提交,原始序列号的值还未被用户输入覆盖,正好适配旧值缓存的需求。
不要在RowEditEnding中直接读取更新后的行数据——这是很多开发者踩过的坑:这个触发点下单元格的编辑值还未同步到绑定数据源,拿到的永远是修改前的旧值。和你现有流程最匹配的提交触发事件分两种情况:

  • 如果使用的是WPF原生DataGrid:在RowEditEnding事件中先判断e.EditAction == DataGridEditAction.Commit,紧接着调用this.dataGrid.CommitEdit(DataGridEditingUnit.Row, true)强制将当前单元格的编辑值提交到绑定的数据源,提交完成后即可直接读取到更新后的完整行数据,不需要额外绑定其他事件。
  • 如果使用的是WinUI/UWP/搭载WPF Toolkit扩展的DataGrid:直接使用RowEditEnded事件即可,这个事件触发时行编辑已经完全提交,数据源已经同步为用户修改后的最新值,直接读取行绑定对象即可拿到全量更新数据。

不要用SelectionChanged、CurrentCellChanged这类事件触发提交,这类事件触发场景极杂,点击滚动条、切换选中行、点击列头排序都会触发,很容易出现重复提交、提交空数据的问题。
针对你提到的空行新增场景,可以在AddingNewItem事件触发初始化新行时,给缓存的原始序列号打一个特殊标记(比如null或者空字符串),后续提交时判断这个标记就能区分当前行要走更新逻辑还是插入逻辑。

更优的实现思路

不要把数据提交逻辑完全耦合在DataGrid的UI事件上,靠UI事件触发顺序保证数据准确性的方案很容易因为控件版本、交互逻辑变更出问题,更稳定的实现方式是做分层的状态跟踪:

  • 给行绑定的数据模型增加三个状态字段:OriginalSerialNumber(存储初始序列号,新增行该值为null)、IsModified(标记当前行是否有未提交的修改)、IsNewRow(标记当前行是否是未入库的新增行),模型实现INotifyPropertyChanged接口,当业务属性被修改时自动将IsModified设为true。
  • DataGrid的AddingNewItem事件触发时,初始化新行对象将IsNewRow设为true、OriginalSerialNumber设为null,不需要额外在UI层用字典、控件Tag缓存旧值,状态跟着数据模型走,不会因为UI事件触发顺序问题丢值。
  • 提交逻辑不需要严格绑定UI编辑完成的时机,可以在用户点击保存按钮、切换行完成等明确的用户操作触发点执行:遍历绑定的数据源集合,筛选出IsNewRow = true的行执行INSERT语句,筛选出IsModified = true且OriginalSerialNumber不为空的行执行UPDATE语句,执行成功后重置行的状态标记,将OriginalSerialNumber更新为最新的序列号值。
  • 所有SQL执行逻辑放在独立的数据访问层,不要直接写在UI事件代码里,统一使用参数化查询避免SQL注入风险,视图层只负责传递修改后的模型对象,不直接拼接SQL语句。

内容的提问来源于stack exchange,提问作者Matt R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:12:56