所以这是我的情景。我有一个C#Winform应用程序,其表单有3个按钮。
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)
我已经搜索了这个问题,并不断提出答案,说明“只需修改表单的标签页集合!简单易用!”但我实际上找不到如何做到这一点的例子。我已经查看了表单的各种方法和属性,但是我没有看到任何看起来非常接近于标签页集合的属性。
所以我在这里。有没有人知道这样做的方法,以便按钮去A - > D - > E - > F - > B - > C当我在运行时以编程方式添加D,E和F时?
谢谢!
答案 0 :(得分:4)
我认为你将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);
}
答案 1 :(得分:3)
我认为问题可能出在以编程方式创建按钮时。
当您以编程方式创建按钮时,表单中已有的所有其他控件都有自己的TabIndex
,如果您将按钮TabIndex
更改为2,则可能另一个控件已共享索引2,这就是它无法正常工作的原因。
一种可能的解决方案,在构建表单时,尽量不要使用以编程方式创建按钮时使用的数字;)
我希望这会有所帮助
答案 2 :(得分:0)
Tab键顺序遍历控件树,您可以使用TabIndex
值控制同一父节点下的对等体之间的顺序。我怀疑问题可能是新的控件被添加到一个封闭的父组中,而不是作为原始按钮控件的对等体。封闭组有自己的TabIndex,它定义了相对于自己的对等体(原始按钮)的顺序,默认情况下放在最后。如果是这种情况,无论您将个人TabIndex
值设置为什么,新按钮都将始终作为一个群组持续使用。
确保封闭组具有TabIndex = 1
(B移动到2等),然后其中的控件应在整个Tab键顺序中在A和B之间全部命中。您应该能够在设计器中执行此操作(同样,使用“文档大纲”窗口来帮助查看表单上控件的树结构)。请注意,TabIndex仅适用于同一父Control的对等体,因此D,E和F可能会获得自己的TabIndex值0,1和2.
或者,如果没有封闭组(如果问题是它不能让您动态更改原始按钮的Tab键顺序),您可以在Tab键顺序中的那个位置添加一个组在原始布局中,然后在其中添加动态按钮。当然,这取决于您的布局是否适合动态按钮的分组。