按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);
    }
}

但这也无济于事。有什么建议吗?

按Tab键不会选择下一个控件

对选项卡按钮的响应由消息循环处理。如果您正在以模态形式运行表单,或者正在调用

Application.Run(myForm);

那么你就得到了一个消息循环。如果你只做

Form myForm = new Form();
myForm.Visible = true;

那么您就没有消息循环,因此选项卡导航将不起作用。(如果您不是以模式运行表单,请尝试使用ShowDialog()方法来显示表单,并查看选项卡在这种情况下是否有效。)

如果这是你的问题,那么下面这篇MSDN文章建议你要么

  1. 在每个Form自己的线程中运行它(这样您就可以在它上面调用Application.Run(myForm))。在自己的线程中运行每个表单是一个巨大的蠕虫罐头,不应该由胆小的人承担(尤其是如果你有预先存在的或设计不好的表单)
  2. 以模式显示对话框

我已经成功地将表单上的KeyPreview设置为true,然后在Form.OnKeyDown方法中侦听System.Windows.Forms.Keys.Tab(如果我处理了,则将KeyEventArgs.SuppressKeyPressKeyEventArgs.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);
        }
    }

我遇到了一个类似的问题,选项卡顺序被完全忽略了。经过两个小时的挖掘,我终于发现了我的愚蠢错误:"如果我的按钮。集中然后…",而我的意思是"如果我按钮。集中那么…"。哎呀。我想我会分享,以防其他人也有这种经历。