DBContext首次保存UltraGrid修改无效,后续操作正常的问题排查
UltraGrid首次保存无效果的原因与修复方案
核心原因
- 控件名称拼写错误:代码里判断激活单元格的是
ultraGrid,但执行退出编辑模式操作的是ultraGrid1,控件名不匹配。首次点击保存时,若当前编辑的单元格在ultraGrid,则不会触发退出编辑模式的逻辑,UltraGrid里的修改会留在编辑缓冲区,没同步到BindingSource和DbContext的实体集合,导致SaveChanges()没有可提交的修改。 - 编辑状态未强制提交:即使控件名正确,若未主动触发BindingSource的提交操作,部分情况下修改可能仍未同步到实体,尤其是首次加载窗体后的第一次编辑。
修复方案
1. 修正控件名称并添加空值判断
把判断和操作的控件名统一,同时避免ActiveCell为null时的空引用异常:
private void btnSave_Click(object sender, EventArgs e) { // 统一控件名,添加空值判断 if (ultraGrid1.ActiveCell?.Activated ?? false) { ultraGrid1.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode); } _context.SaveChanges(); _context.Dispose(); Close(); }
2. 强制提交BindingSource修改
在保存前调用BindingSource.EndEdit(),确保所有编辑的修改都同步到DbContext的实体:
private void btnSave_Click(object sender, EventArgs e) { if (ultraGrid1.ActiveCell?.Activated ?? false) { ultraGrid1.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode); } // 强制提交BindingSource的修改到实体 ModuleBindingSource.EndEdit(); _context.SaveChanges(); _context.Dispose(); Close(); }
3. 优化DbContext生命周期管理
改用窗体关闭事件释放上下文,避免手动Dispose的潜在问题:
private void btnSave_Click(object sender, EventArgs e) { if (ultraGrid1.ActiveCell?.Activated ?? false) { ultraGrid1.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode); } ModuleBindingSource.EndEdit(); _context.SaveChanges(); Close(); } // 窗体关闭时释放上下文 private void ChildForm_FormClosing(object sender, FormClosingEventArgs e) { _context?.Dispose(); }
内容的提问来源于stack exchange,提问作者ChrisW
相关产品推荐
相关产品推荐

