WinForms DataGridView单元格未即时更新问题求最优解决方案
解决DataGridView编辑后直接点击按钮不更新的问题
这个问题的核心原因很明确:当你还处于单元格编辑状态时直接点击按钮列,DataGridView不会自动结束当前的编辑流程,导致你修改的新值还没提交到绑定的DataTable里,后续操作拿到的还是旧值,UI自然也不会即时刷新显示新内容。
不需要逐个设置CurrentCell这种繁琐的操作,最简单高效的解决方案是在CellClick事件的最开头强制结束所有编辑状态,这样就能确保所有未提交的修改都被同步到数据源,UI也会自动更新。
修改你的CellClick事件代码:
private void dgv_CellClick(object sender, DataGridViewCellEventArgs e) { // 先强制结束所有正在进行的编辑,确保修改值提交到数据源 dgv.EndEdit(DataGridViewDataErrorContexts.Commit); // Button on grid if (e.ColumnIndex == 17) { string val1 = dgv.Rows[e.RowIndex].Cells[3].Value.ToString(); string val2 = dgv.Rows[e.RowIndex].Cells[5].Value.ToString(); Task.Factory.StartNew<Dictionary<string, Response>>(() => GenerateData(val1, val2)) .ContinueWith(ant => { int rowId = Convert.ToInt32(this.dgv.Rows[e.RowIndex].Cells[1].Value); SetResponse(rowId, this.DataSet.DataTable, ant.Result); // 现在不需要逐个设置CurrentCell了,EndEdit已经搞定了值的提交和UI更新 }, TaskScheduler.FromCurrentSynchronizationContext()); } }
额外说明:
EndEdit(DataGridViewDataErrorContexts.Commit)会触发DataGridView完成当前单元格的编辑流程,把修改后的值同步到绑定的DataTable,同时自动刷新UI显示新值,一步到位解决你遇到的问题。- 如果你想从根源上减少这类问题,还可以检查DataGridView的
EditMode属性,比如设置为EditOnEnter或者EditOnKeystrokeOrF2,让编辑状态的触发更符合你的操作习惯,但上面的EndEdit方法是最可靠的兜底方案,不管编辑模式是什么都能生效。
内容的提问来源于stack exchange,提问作者JoeyDiaz
相关产品推荐
相关产品推荐

