【问题标题】:Windows Form - Tab key does not work in a child panelWindows 窗体 - Tab 键在子面板中不起作用
【发布时间】:2010-01-25 15:43:19
【问题描述】:

我的表单中有一个子面板,其中包含一些文本框和按钮。我尝试为这些控件设置 tabstop 和 tabindex 属性,以便用户可以从一个控件切换到下一个控件。但是由于某种原因,制表符不起作用,当我按下制表键时,光标停留在具有焦点的同一字段上。我正在使用带有 .Net 3.5 框架的 C#。下面是我的代码的样子 -

  rightPanel.Controls.Clear();
        marketMessageLabel = new Label();
        marketMessageLabel.Location = new Point(0, 20);            
        marketMessageLabel.AutoSize = false;
        marketMessageLabel.Size = new Size(rightPanel.Width, 42);
        marketMessageLabel.BackColor = Color.White;            
        marketMessageLabel.Font = new System.Drawing.Font("Verdana", 8.00F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        rightPanel.Controls.Add(marketMessageLabel);                        

        signinUserNameLabel = new Label();
        signinUserNameLabel.Location = new Point(0, 150);
        signinUserNameLabel.Size = new Size(60, 14);
        signinUserNameLabel.BackColor = Color.White;
        signinUserNameLabel.Text = "User Name";            
        signinUserNameLabel.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        rightPanel.Controls.Add(signinUserNameLabel);

        signinUserNameTextBox = new TextBox();
        signinUserNameTextBox.Location = new Point(0, 170);
        signinUserNameTextBox.Width = this.Width - 80;
        signinUserNameTextBox.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));         
        signinUserNameTextBox.TabIndex = 0;
        signinUserNameTextBox.TabStop = true;

        rightPanel.Controls.Add(signinUserNameTextBox);

        signinPasswordLabel = new Label();
        signinPasswordLabel.Location = new Point(0, 192);
        signinPasswordLabel.Size = new Size(100, 14);
        signinPasswordLabel.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        signinPasswordLabel.BackColor = Color.White;
        signinPasswordLabel.Text = "Password";            
        rightPanel.Controls.Add(signinPasswordLabel);                      

        signinPasswordTextBox = new TextBox();
        signinPasswordTextBox.Location = new Point(0, 210);
        signinPasswordTextBox.Width = this.Width - 80;            
        signinPasswordTextBox.PasswordChar = '*';
        signinPasswordTextBox.TabIndex = 1;
        signinPasswordTextBox.TabStop = true;
        rightPanel.Controls.Add(signinPasswordTextBox);

        signInButton = new Button();
        signInButton.Text = "Sign In";
        signInButton.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        signInButton.Width = 70;            
        signInButton.BackColor = Color.White;
        signInButton.Location = new Point(0,240);
        signInButton.Click += new EventHandler(signInButton_Click);
        signInButton.TabIndex = 2;
        signInButton.TabStop = true;
        rightPanel.Controls.Add(signInButton);

【问题讨论】:

  • 使用 UserControl 代替。并且不要在未对子控件调用 Dispose() 的情况下使用 Clear(),它会永久泄漏控件窗口句柄。

标签: c# winforms tabbing


【解决方案1】:

另一个可能的问题是,如果“制表符”不起作用的表单位于非模态显示的表单上。

由于某些原因,如果子表单显示为.show,则“tabbing”有时不起作用,而您更愿意使用.ShowDialog 显示该表单。

【讨论】:

  • 我发现如果我在 form.Show() 之后调用 Application.Run() ,则选项卡将起作用。我认为这与 windows 消息传递循环没有通过 form.show() 自动实现有关
【解决方案2】:

如果表单是无模式的(用.Show()显示),那么需要添加如下代码来处理keyDown事件:

    private void YourForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Tab)
        {
            if (e.Modifiers == Keys.Shift)
                this.ProcessTabKey(false);
            else
                this.ProcessTabKey(true);
        }
    }

您还需要将 KeyPreview 属性设置为 True。

【讨论】:

    【解决方案3】:

    解决方法是在面板上设置 TabStop = true。

    我刚刚进行了一个小测试,如果面板之外没有其他可聚焦的控件,winforms 似乎不会进入子面板。

    您实际上不会最终将选项卡“放在”面板上,但它可以帮助您解决您所看到的这个问题,并且它将选项卡到它的第一个子控件。

    【讨论】:

      【解决方案4】:

      确保您也为标签设置了 tabindex,尽管它不可​​聚焦。

      在 VS 设计器窗口中,将您的表单显示在屏幕上的更多设计中,点击

      • 查看菜单
      • 标签顺序菜单选项

      点击设置控件的顺序(包括标签)。

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

        猜你喜欢
        • 2014-07-03
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        相关资源
        最近更新 更多