为什么ProcessCmdKey()不处理控件的焦点?

时间:2015-03-20 14:41:10

标签: c# winforms

在我youtube video上显示的应用中,组合框中有一个 numericupdown 控件numericupdown3,而在该组框外面有一些其他文本框即可。当光标处于 numericupdown 控件时,当我点击标签时,它应该将光标移动到textbox3,即组框下的第一个文本框。但它转移到tbx3,即组框下的第二个文本框。如视频所示,我使用processCmdKey()来处理,但它仍然没有将光标移动到textbox3。有趣的是,它在代码中显示当前主动控制textbox3,但在表单上,​​光标在tbx3上闪烁。有没有办法来解决这个问题?我还设置了所有显示在视频上的标签顺序。

这是youtube视频的动画gif

enter image description here

以下是ProcessCmdKey()事件中的代码,请注意我已设置了Tab键顺序,numericupdown3 - > 1,textbox3 - > 2和tbx3 - > 3并且已在所有其他文本框控件中将TabStop设置为false并将其设置为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)

1 个答案:

答案 0 :(得分:2)

正如chat中所述:

解决方案:

根据您的需要重置控件的tab-index。 每个容器(面板,组合框等)的底层控件的TabIndex从0开始。

在VisualStudio中,还可以直观地看到整个表单的TabIndex(查看> Tab顺序

执行此操作后,请删除ProcessCmdKey事件,因为稍后会再次显示标签顺序。

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

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

允许Tab键正常工作的一种(脏)方法是将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()事件的处理,并允许正常的标签顺序流动。