DataGridView单元格输入空格/回车触发新窗体实例的问题排查
问题原因分析
这种情况大概率是Inventor的消息路由机制导致按键被误触发:
- 你用
Show()显示窗体时,窗体是非模态的,Inventor主程序仍会监听键盘输入。 - 当在DataGridView单元格编辑时,空格/回车按键消息没有被窗体完全拦截,反而被Inventor识别为触发了功能区按钮的执行事件,从而新建了窗体实例。
解决思路及步骤
1. 改用模态对话框显示窗体(最有效)
将启动代码中的Show()替换为ShowDialog(),模态对话框会独占焦点,拦截所有键盘消息,避免Inventor主程序捕获到按键:
override protected void ButtonDefinition_OnExecute(NameValueMap context) { EditRevisionTableForm rtf = new EditRevisionTableForm(); rtf.ShowDialog(); // 替换原有的Show() }
2. 检查功能区按钮的快捷键配置
确认你的功能区按钮定义中,是否将空格或回车设置为了快捷键。如果有相关的KeyAssignment配置,直接移除即可避免误触发。
3. 强制窗体获取焦点
在窗体的Load事件末尾添加焦点设置,确保窗体优先接收键盘消息:
private void EditRevisionTableForm_Load(object sender, EventArgs e) { // 原有的填充DataGridView代码... this.Focus(); dgvRevTable.Focus(); }
4. 拦截DataGridView的按键消息
给DataGridView添加KeyDown事件,手动处理空格和回车,阻止消息向上传递:
private void dgvRevTable_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space || e.KeyCode == Keys.Enter) { e.Handled = true; // 如果需要保留回车的单元格编辑功能,可以根据需求调整,比如: // if (e.KeyCode == Keys.Enter) dgvRevTable.CurrentCell = dgvRevTable.GetNextCurrentCell(true); } }
内容的提问来源于stack exchange,提问作者Mike S
相关产品推荐
相关产品推荐

