Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在winform窗体中更改选项卡顺序或修改选项卡页集合?_C#_Winforms_Tabindex - Fatal编程技术网

C# 如何在winform窗体中更改选项卡顺序或修改选项卡页集合?

C# 如何在winform窗体中更改选项卡顺序或修改选项卡页集合?,c#,winforms,tabindex,C#,Winforms,Tabindex,这是我的设想。我有一个C#Winform应用程序,它的表单有3个按钮 Button A; //Default tabindex == 0 Button B; //Default tabindex == 1 Button C; //Default tabindex == 2 我以编程方式创建了3个按钮,并在表单中添加了3个:D、E和F D.TabIndex = 1; E.TabIndex = 2; F.TabIndex = 3; B.TabIndex = 4; C.TabIndex = 5;

这是我的设想。我有一个C#Winform应用程序,它的表单有3个按钮

Button A; //Default tabindex == 0
Button B; //Default tabindex == 1
Button C; //Default tabindex == 2
我以编程方式创建了3个按钮,并在表单中添加了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


谢谢大家!

我认为问题可能是当您以编程方式创建按钮时

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

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


我希望这会有所帮助

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

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

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


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

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


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

表单上是否有任何分组控件?这可能会导致制表符顺序中断。我在这里不太清楚:制表符顺序是否正确,或者制表符控件页面是否与实际按钮匹配有问题?b.TabIndex=this.Controls.OfType.Max(c=>c.TabIndex+1);
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);
}