【问题标题】:why ProcessCmdKey() does not handle focus of controls?为什么 ProcessCmdKey() 不处理控件的焦点?
【发布时间】:2015-03-21 00:46:12
【问题描述】:

在我的应用程序中,youtube videogroupbox 中有一个 numericupdown 控件 numericupdown3,并且在 groupbox 之外还有一些其他 textboxes。当光标在 numericupdown 控件中并且当我点击选项卡时,它应该将光标移动到 textbox3 即组框下的第一个文本框。但它改为移动到tbx3,即组框下的第二个文本框。如视频所示,我使用processCmdKey() 进行处理,但它仍然没有将光标移动到textbox3。有趣的是在代码中它显示当前活动控制textbox3,但在表单上,​​光标在tbx3 上闪烁。有没有办法来解决这个问题?我还设置了所有显示在视频中的标签顺序。

这是 youtube 视频的 gif 动画

这是 ProcessCmdKey() 事件中的代码,请注意我已经设置了 tab 顺序 numericupdown3 -> 1、textbox3 --> 2 和 tbx3 --> 3 并且在所有其他中禁用并将 TabStop 设置为 false文本框控件

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Tab)
    {
        if (this.ActiveControl.Name == numericUpDown3.Name)
        {
            this.ActiveControl = this.textBox3;
            Console.WriteLine(this.ActiveControl.Name);
        }

    }
    return base.ProcessCmdKey(ref msg, keyData);
}

PS-我使用 VS 2010(未安装 SP)

【问题讨论】:

  • 请在您的问题中添加一些重现问题的最少代码。很难通过视频来诊断问题(因为 youtube 被屏蔽了,我无论如何都无法在工作中看到)
  • 您查看过控件的 Tab 键顺序吗?
  • @SteveMitcham 我已经用一些代码更新了帖子
  • @BerndLinde 是 numericupdown3 是 1,textbox3 是 2,tbx3 是 3
  • 控件是否在不同的面板/组框中?

标签: c# winforms


【解决方案1】:

chat中所述:

解决办法:

根据您的需要重置控件的选项卡索引。 每个容器(面板、组框等)都有其底层控件的 TabIndex 从 0 开始。

在 VisualStudio 中也有一个方便的工具可以直观地查看整个表单的 TabIndex (View > Tab Order)

完成此操作后,删除 ProcessCmdKey 事件,因为这会在稍后再次与 Tab 键顺序混淆。

正如聊天中提到的,确保您正在检查所有控件的 TabIndex,即使是那些隐藏在其他控件后面的控件!

其他方法都失败时的脏方法(不推荐,但知道可能有用):

让选项卡正常工作的一种(肮脏)方法是将 ProcessCmdKey() 事件处理程序更改为以下代码(阅读代码下方的警告):

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
  if (keyData == Keys.Tab)
  {
    if (this.ActiveControl.Name == numericUpDown3.Name)
    {
      this.ActiveControl = this.textBox3;
      Console.WriteLine(this.ActiveControl.Name);
      return true; // Stop the processing of additional key presses
    }

  }
  return base.ProcessCmdKey(ref msg, keyData);
}

警告:
return true 所做的是防止触发任何额外的 KeyPress 事件。因此,请谨慎使用它,在实施更改后测试您的代码,以确保一切仍按计划运行。

这个问题的最佳(和干净)解决方法是找出为什么在这种情况下不遵守跳位顺序。完成后,应删除对 ProcessCmdKey() 事件的处理,并允许正常的跳格顺序流动。

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 2011-02-10
    • 1970-01-01
    • 2014-05-24
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多