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

时间:2014-09-16 14:06:57

标签: c# winforms

我的winform中有四个文本框,我已经按顺序订购了它们的标签索引。另外,我将TabStop属性设置为true。但是当我在填充第一个文本框时按Tab键时,它不会移动到下一个文本框。为此,我甚至在代码中为每个部分添加了以下部分:

firstTextbox.KeyDown += (sender, args) => 
{
    if(args.KeyCode == Keys.Tab)
    {
        firstTextbox.SelectNextControl(this, true, true, true, true);
    }
}

但这也没有帮助。有什么建议吗?

6 个答案:

答案 0 :(得分:1)

响应标签按钮由消息循环处理。如果您将表单作为模式运行,或正在调用

Application.Run(myForm);

然后你有一个消息循环。如果你只做

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

然后你没有消息循环,因此标签导航不起作用。 (如果您没有以模态方式运行表单,请尝试使用ShowDialog()方法显示表单,并查看tabbing是否适用于此情况。)

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

  1. 在自己的线程中运行每个Form(以便可以在其上调用Application.Run(myForm))。在自己的线程中运行每个表单是一个巨大的蠕虫,不应该由胆小的人承担(特别是如果你有预先存在或设计不佳的形式)。
  2. 以模态显示对话框。
  3. https://msdn.microsoft.com/en-us/library/ms229591(v=vs.110).aspx

    我在将表单上的KeyPreview设置为true,然后在Form.OnKeyDown方法中侦听System.Windows.Forms.Keys.Tab(以及设置KeyEventArgs.SuppressKeyPress和如果我处理它,KeyEventArgs.Handled为true)。 (还记得检查KeyEventArgs.Modifiers属性以查看用户是否正在执行[Shift] + [Tab]。)这样做的缺点是你抢夺了有机会响应按键的控件,因为Form.KeyPreview使表单在控件获得机会之前有机会处理该键。 (我也不确定如果你实现了这个逻辑会发生什么让消息循环继续。)

    对于检测Tab键时应该执行的操作,请查看Control.SelectNextControl函数。我一直称它为...

    e.SuppressKeyPress = SelectNextControl(
        ActiveControl, //Current Control
        true,  //Move Forward? (You want false for a Shift-Tab to go backwards.)
        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?
    

    比我聪明的人可能能够建立共享的消息循环或其他东西,但这是我迄今为止所想的全部。

答案 1 :(得分:0)

Windows窗体应用程序中的每个控件都具有属性

this.button1.TabIndex = 3;

如果您正确订购,可以使用它来选择下一个控件。

答案 2 :(得分:0)

如果您的文本框是多行的,则需要将AcceptsTab属性设置为false。

答案 3 :(得分:0)

也许你的事件处理程序没有被注册。确保文本框不是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);

        }
    }

答案 4 :(得分:0)

我能够使用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();
    ...
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx

答案 5 :(得分:0)

我遇到类似的问题,完全忽略了Tab键顺序。经过两个小时的挖掘,我终于找到了我的愚蠢错误:"如果mybutton.Focus那么......"当我的意思是"如果myButton.Focused然后......"。哎呀。如果其他人也有这种经历,我想分享。