在CF .net框架中设置TabIndex

时间:2009-01-27 01:30:56

标签: c# .net compact-framework tabindex

我有一个包含3个面板的表单,创建面板是因为在某些时候我需要隐藏/显示某些控件组。到目前为止,它运行良好 - 直到我被要求使用TAB键导航表单的特定方式。

首先,我注意到Panel对象中没有TabIndex属性,最重要的是,我不想遵循嵌套导航算法,我只想设置自己的序列。

到目前为止,我在网上看到的内容,面板无法实现。我唯一的选择是将表单上的所有控件放在同一个面板中。

有什么想法?我不想重新安排应用程序,并开始隐藏和显示单独的控件。

3 个答案:

答案 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秒。如果它们都在表单表面上,您可以使用选项卡索引。

虽然现在我想到了,但是他们在自己的面板上有什么问题?如果您使用面板显示/隐藏,那么您无论如何都不会选中其他面板。

另一种选择是编写关键事件处理程序,但我会远离它 - 这将是一个巨大的无法维护的混乱。