我有一个包含3个面板的表单,创建面板是因为在某些时候我需要隐藏/显示某些控件组。到目前为止,它运行良好 - 直到我被要求使用TAB键导航表单的特定方式。
首先,我注意到Panel对象中没有TabIndex属性,最重要的是,我不想遵循嵌套导航算法,我只想设置自己的序列。
到目前为止,我在网上看到的内容,面板无法实现。我唯一的选择是将表单上的所有控件放在同一个面板中。
有什么想法?我不想重新安排应用程序,并开始隐藏和显示单独的控件。
答案 0 :(得分:4)
按TAB键将焦点移动到ControlCollection中的下一个控件。由于焦点始终位于Panel内的控件中而不是面板本身,因此您如何期望Panel支持制表索引?
我建议你再想一想你要做的事情。当特定面板可见时,TAB应该围绕其中的控件进行导航。 TAB让您在下一个面板中移动是没有意义的。这通常通过按钮或其他控件来完成。用户希望TAB移动焦点而不执行操作。此外,如果你想让TAB移动你的面板,那么你需要将所有控件的Tab Stop属性设置为false。
答案 1 :(得分:2)
我有同样的问题。我的解决方案是将所有控件放在表单上的子面板中。 .net算法的选项卡是使用TabIndex在'current'容器中的tab。如果容器中的任何TabIndexs相同,则z顺序中的第一个TabIndex将是第一个,等等。
一旦进入容器(表单是容器),除容器(面板)以外的所有控件都会被标记为第一个。离开最后一个非容器控件时,面板将被递归。
因此,如果所有控件都放在同一级别的容器/面板中,您的标签将按预期完成。
示例问题:
Form control1 Tabindex=1 panel1 control2 Tabindex=2 control3 Tabindex=2 panel2 control4 Tabindex=4 control5 Tabindex=5 control6 Tabindex=6
Tabbing将按以下顺序排列(不是您的预期):
Control1 Control6 <-- not what you wanted/expected Control2 Control3 Control4 Control5
要使其正确显示,请按以下模式进行布局:
Form panel0 control1 Tabindex=1 panel1 control2 Tabindex=2 control3 Tabindex=2 panel2 control4 Tabindex=4 control5 Tabindex=5 panel3 control6 Tabindex=6
答案 2 :(得分:0)
我认为你几乎被困在那里 - 我不知道有什么直接的方法来避免嵌套导航。
但是,我会说, 显示/隐藏控件组是非常重要的:
private void SetPrimaryControlVisibility(bool visible)
{
ctrlA.Visible = visible;
ctrlB.Visible = visible;
ctrlF.Visible = visible;
}
private void SetSecondaryControlVisibility(bool visible)
{
ctrlC.Visible = visible;
ctrlE.Visible = visible;
ctrlG.Visible = visible;
}
这是一个更多的代码编写 - 但这花了我20秒。如果它们都在表单表面上,您可以使用选项卡索引。
虽然现在我想到了,但是他们在自己的面板上有什么问题?如果您使用面板显示/隐藏,那么您无论如何都不会选中其他面板。
另一种选择是编写关键事件处理程序,但我会远离它 - 这将是一个巨大的无法维护的混乱。