C# DataGridView设置CurrentCell为编辑模式失败求助
解决方案
你的问题核心在于回车的默认行为干扰了编辑模式的触发,加上事件绑定逻辑的重复触发和调用时机不当,导致BeginEdit(true)无法生效。以下是针对性的修复步骤和代码:
1. 移除不必要的CurrentCellChanged事件处理
该事件会在每次单元格切换时触发,打乱自定义的编辑流程,直接删除这个事件的绑定和实现:
// 删除此事件处理方法 // private void DGV_score_CurrentCellChanged(object sender, EventArgs e) // { // DGV_score.BeginEdit(true); // }
2. 修正PreviewKeyDown事件逻辑
修改回车处理逻辑,阻止默认行为并延迟触发编辑模式:
private void DGV_score_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyData == Keys.Enter) { // 标记为输入键,阻止DataGridView默认的回车行为(如自动移动单元格) e.IsInputKey = true; if (DGV_score.CurrentRow.Index == maxrow) { DGV_score.Rows.Add(); maxrow++; DataGridViewCell targetCell = leg % 2 != 0 ? DGV_score.Rows[maxrow].Cells[0] : DGV_score.Rows[maxrow].Cells[2]; DGV_score.CurrentCell = targetCell; // 使用BeginInvoke延迟执行,确保DataGridView完成新行渲染后再进入编辑模式 DGV_score.BeginInvoke(new Action(() => { if (DGV_score.CurrentCell == targetCell) { DGV_score.BeginEdit(true); } })); } } }
3. 优化EditingControlShowing的事件绑定
避免重复绑定事件导致逻辑多次触发:
private void DGV_score_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl tb) { // 通过Tag标记避免重复绑定事件 if (tb.Tag == null) { tb.KeyDown += DGV_score_KeyDown; tb.PreviewKeyDown += DGV_score_PreviewKeyDown; tb.Tag = true; } } }
关键修复说明
e.IsInputKey = true:阻止DataGridView对回车的默认处理(比如自动切换到下一个单元格),确保自定义逻辑完全掌控焦点和编辑状态。BeginInvoke:刚添加新行并设置CurrentCell后,DataGridView内部还在处理控件布局和焦点同步,延迟调用BeginEdit能确保控件状态稳定后触发编辑模式。- 事件绑定优化:每次
EditingControlShowing触发时,若不判断重复绑定,会导致同一个事件被多次注册,引发重复执行逻辑的问题。
内容的提问来源于stack exchange,提问作者LemmyDartsfan
相关产品推荐
相关产品推荐

