按Tab键不会选择下一个控件
本文关键字:选择 下一个 控件 Tab | 更新日期: 2023-09-27 18:22:13
我的winform中有四个文本框,我已经按顺序排列了它们的选项卡索引。此外,我将它们的TabStop
属性设置为true
。但当我在填充第一个文本框时按下Tab
键时,它不会移动到下一个。为此,我甚至在代码中为它们添加了以下部分:
firstTextbox.KeyDown += (sender, args) =>
{
if(args.KeyCode == Keys.Tab)
{
firstTextbox.SelectNextControl(this, true, true, true, true);
}
}
但这也无济于事。有什么建议吗?
对选项卡按钮的响应由消息循环处理。如果您正在以模态形式运行表单,或者正在调用
Application.Run(myForm);
那么你就得到了一个消息循环。如果你只做
Form myForm = new Form();
myForm.Visible = true;
那么您就没有消息循环,因此选项卡导航将不起作用。(如果您不是以模式运行表单,请尝试使用ShowDialog()
方法来显示表单,并查看选项卡在这种情况下是否有效。)
如果这是你的问题,那么下面这篇MSDN文章建议你要么
- 在每个Form自己的线程中运行它(这样您就可以在它上面调用
Application.Run(myForm)
)。在自己的线程中运行每个表单是一个巨大的蠕虫罐头,不应该由胆小的人承担(尤其是如果你有预先存在的或设计不好的表单) - 以模式显示对话框
我已经成功地将表单上的KeyPreview
设置为true
,然后在Form.OnKeyDown
方法中侦听System.Windows.Forms.Keys.Tab
(如果我处理了,则将KeyEventArgs.SuppressKeyPress
和KeyEventArgs.Handled
设置为true
)。(还记得检查KeyEventArgs.Modifiers
属性,看看用户是否在执行[Shift]+[Tab]。)这样做的缺点是,您会剥夺关注响应keypress
的机会的控件,因为Form.KeyPreview
会导致Form在控件获得机会之前获得处理密钥的机会。(我也不确定如果你实现了这个逻辑并且让消息循环进行,会发生什么。)
至于检测到Tab键时应该做什么,请查看Control.SelectNextControl
函数。我一直称之为。。。
e.SuppressKeyPress = SelectNextControl(
ActiveControl, //Current Control
true, //Move Forward? (You want false for a Shift-Tab to go backward.)
true, //Only stop at controls where Control.TabStop == true?
true, //Consider controls nested within other controls?
true); //Wrap to the beginning of the form if you reach the end?
一个比我聪明的人可能会建立一个共享消息循环或其他什么,但这是我迄今为止所知道的。
使用Tab键激发textBox1_KeyDown
的唯一方法是重写IsInputKey
方法。
class TabTextBox : TextBox
{
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Tab)
{
return true;
}
else
{
return base.IsInputKey(keyData);
}
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyData == Keys.Tab)
{
this.SelectedText = " ";
}
else
{
base.OnKeyDown(e);
}
}
然后修改InitializeComponent():
private void InitializeComponent()
{
...
this.textBox1 = new TabTextBox();
...
}
Forms.Control.isInputKey
windows窗体应用程序中的每个控件都具有属性
this.button1.TabIndex = 3;
如果订购正确,您可以使用它来选择下一个控件。
如果文本框是多行的,则需要将AcceptsTab属性设置为false。
也许您的事件处理程序没有注册。确保文本框不是ReadOnly=true,TabStop=false。试试这个
public Form1()
{
InitializeComponent();
this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
textBox1.SelectNextControl(sender as Control, true, true, true, true);
}
}
我遇到了一个类似的问题,选项卡顺序被完全忽略了。经过两个小时的挖掘,我终于发现了我的愚蠢错误:"如果我的按钮。集中然后…",而我的意思是"如果我按钮。集中那么…"。哎呀。我想我会分享,以防其他人也有这种经历。