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