You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:56:24