C# 如何在winform窗体中更改选项卡顺序或修改选项卡页集合?
这是我的设想。我有一个C#Winform应用程序,它的表单有3个按钮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;
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);
}