C# WinForm:DataGridView双击时取消单元格编辑并跳过验证
解决DataGridView加载时触发CellValidating的问题
针对你遇到的这个问题,有两种比较直接的解决方案,你可以根据自己的业务场景选择:
方案1:用标志位跳过加载时的验证
你可以添加一个布尔字段标记当前是否处于表格加载状态,在CellValidating事件里先检查这个标志,加载过程中直接跳过验证逻辑。
具体步骤:
- 在窗体类中添加私有字段:
private bool _isGridLoading = false;
- 修改
Grid_Load方法,在加载前后设置标志位(用finally确保标志位一定会被重置):
public void Grid_Load() { _isGridLoading = true; try { // 你的表格加载逻辑,比如绑定数据源、刷新数据等 } finally { _isGridLoading = false; } }
- 更新
CellValidating事件,先判断标志位再执行验证:
private void gridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { // 如果处于加载状态,直接跳过验证 if (_isGridLoading) return; string code = e.FormattedValue.ToString(); string headerText = gridView.Columns[e.ColumnIndex].HeaderText; if (!headerText.Equals("No. Transaksi")) return; if (string.IsNullOrEmpty(code)) { MessageBox.Show("No. Transaksi tidak boleh kosong!"); e.Cancel = true; } }
方案2:双击单元格时先取消编辑状态
另一种思路是在打开子窗体前,先结束DataGridView的当前编辑状态,这样后续重新加载表格时,就不会因为存在未完成的编辑会话而触发验证。
修改你的gridView_CellDoubleClick事件:
private void gridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { // 先结束当前编辑状态,避免后续触发验证 if (gridView.IsCurrentCellInEditMode) { gridView.EndEdit(); } dialogContainerForm dialogForm = new dialogContainerForm(username); dialogForm.ShowDialog(this); }
两种方案都能解决你的问题:方案1直接针对加载场景屏蔽验证,方案2从触发源头消除验证触发的条件,你可以根据自己的业务逻辑选择合适的方式。
内容的提问来源于stack exchange,提问作者Jun Rikson
相关产品推荐
相关产品推荐

