如何仅在按下回车键时触发DataGridView的CellEndEdit事件?
解决DataGridView CellEndEdit仅响应回车键的问题
这个坑我之前踩过!确实,CellEndEdit默认会在多种场景触发,而且鼠标点击切换时如果在事件里做了单元格相关操作很容易触发重入错误。要让它只在按下回车键时执行逻辑,可以这么做:
核心思路
通过标记位判断编辑结束的触发源是否为回车键,只在标记为真时执行你的业务逻辑,同时规避重入调用的问题。
具体实现步骤
- 声明一个标记变量,用来记录是否是回车键触发的编辑结束:
private bool _isEnterTriggered;
- 监听DataGridView的KeyDown事件,判断按下的是否是回车键,更新标记位:
private void YourDataGridView_KeyDown(object sender, KeyEventArgs e) { // 只有按下回车键时标记为true _isEnterTriggered = e.KeyCode == Keys.Enter; }
- 修改CellEndEdit事件逻辑,仅当标记位为true时执行你的代码:
private void YourDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { // 如果不是回车键触发,直接返回,不执行后续操作 if (!_isEnterTriggered) { return; } // -------------------------- // 这里写你原本要执行的业务逻辑 // 比如单元格内容验证、数据更新等 // -------------------------- // 重置标记位,避免下次误判 _isEnterTriggered = false; }
额外说明
- 这样设置后,鼠标点击切换单元格、箭头键切换时,CellEndEdit事件虽然还是会触发,但不会执行你的核心逻辑,自然也不会出现
Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function这个错误了。 - 如果之后需要支持Tab键触发,只需要在KeyDown事件里把
Keys.Tab也加入判断即可,比如:_isEnterTriggered = e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab;
内容的提问来源于stack exchange,提问作者student2020
相关产品推荐
相关产品推荐

