【问题标题】:How to change tab order or modify tab page collection in a winform form?如何在winform表单中更改标签顺序或修改标签页集合?
【发布时间】:2014-03-17 18:41:17
【问题描述】:

所以这是我的场景。我有一个带有 3 个按钮的表单的 C# Winform 应用程序。

Button A; //Default tabindex == 0
Button B; //Default tabindex == 1
Button C; //Default tabindex == 2

我以编程方式创建并添加另外 3 个按钮到表单:D、E 和 F。然后我尝试以下操作

D.TabIndex = 1;
E.TabIndex = 2;
F.TabIndex = 3;
B.TabIndex = 4;
C.TabIndex = 5;

当我选择标签时,它应该会去

A -> D -> E -> F -> B -> C

当我通过控件运行应用程序和选项卡时,它的实际运行方式是

A -> B -> C -> (some combination of D -> E -> F in whatever order I make them in)

我已经用谷歌搜索了这个问题,并不断提出答案,这些答案类似于“只需修改表单的标签页集合!简单易行!”但我实际上找不到如何做到这一点的例子。我查看了表单的各种方法和属性,但没有看到任何看起来很接近标签页集合的属性。

所以我来了。有谁知道这样做的方法,当我在运行时以编程方式添加 D、E 和 F 时,按钮变为 A -> D -> E -> F -> B -> C?

谢谢!

【问题讨论】:

  • 表单上有组控件吗?这可能会导致标签顺序中断。
  • 这里我不清楚:您对正确的标签顺序或将 TabControl 页面与实际按钮匹配有问题吗?

标签: c# winforms tabindex


【解决方案1】:

我认为您将 TabIndex 与 TabControls 和 TabPages 等词混淆了。TabIndex 是当用户单击键盘上的 Tab 键时控件获得焦点的顺序。

要插入新按钮,您需要重新索引父容器中的现有控件。

一个工作示例(假设您的表单上已经有按钮 A、B、C):

int tabIndex = 1;
foreach (string s in new string[] { "D", "E", "F" }) {
  Button b = new Button();
  b.Text = s;
  foreach (Control c in this.Controls) {
    if (c.TabIndex >= tabIndex) {
      c.TabIndex++;
    }
  }
  b.Location = new Point(16, tabIndex * b.Height + 4);
  b.TabIndex = tabIndex++;
  this.Controls.Add(b);
}

【讨论】:

  • b.TabIndex = this.Controls.OfType.Max(c => c.TabIndex+1);
【解决方案2】:

我认为问题可能出在您以编程方式创建按钮时。

当您以编程方式创建按钮时,表单中已有的所有其他控件都有自己的 TabIndex,然后如果您将按钮 TabIndex 更改为 2,则可能另一个控件已经共享索引 2,并且这就是它无法正常工作的原因。

一种可能的解决方案,当您构建表单时,尽量不要使用您将在以编程方式创建按钮时使用的数字;)

希望对你有帮助

【讨论】:

    【解决方案3】:

    Tab 顺序遍历控件树,可以通过TabIndex 值控制同一父节点下的peer 之间的顺序。我怀疑问题可能是新控件被添加到封闭的父组中,而不是作为原始按钮控件的对等体。封闭组有它自己的 TabIndex,它定义了它相对于它自己的对等点(原始按钮)的顺序,并且默认情况下放在最后。如果是这种情况,无论您将其单独的 TabIndex 值设置为什么,新按钮将始终作为一组最后一个。

    确保封闭组具有TabIndex = 1(将 B 移至 2 等),并且其中的控件应按整个 Tab 键顺序在 A 和 B 之间全部命中。您应该能够在设计器中执行此操作(也可以使用“文档大纲”窗口来帮助查看表单上控件的树结构)。请注意,TabIndex 仅适用于同一父 Control 的对等方,因此 D、E 和 F 可能会获得各自的 TabIndex 值 0、1 和 2。

    或者,如果没有封闭组(如果问题是它不允许您动态更改原始按钮的 Tab 键顺序),您可以在原始布局,然后在其中添加动态按钮。当然,这取决于您的布局是否适合动态按钮的这种分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      相关资源
      最近更新 更多