1

我有一个带有SplitContainer的 Windows 窗体。在这个SplitContainer中是其他面板。

Panel1包含一个名为的自定义控件InputControl和一个名为Display.

为了找出当前显示的项目,我转向GetChildIndex 方法并使用 Windows 窗体作为父项:

int inputIndex = parent.Controls.GetChildIndex(InputControl);
int displayIndex = parent.Controls.GetChildIndex(Display);

在编写此代码时,我不确定是否可以将 Windows 窗体作为父窗体传入,因此我在之后放置了一个断点以检查两个索引是否大于 -1:

      if ((-1 < inputIndex) && (-1 < displayIndex)) {

然而,在第一个整数inputIndex被赋值之前,我被授予了ArgumentException这条消息,以表彰我的努力:

'child' 不是这个父级的子控件。

好的,我想这些不是这个父级的直接子控件。

另一方面,SplitContainer 肯定是直接子控件那么,我应该搜索SplitContainer控件吗?

不过,从技术上讲,我想要 z-index 的控件位于Panel1控件中。这是否意味着我的代码必须看起来如此丑陋?

int inputIndex = splitControl1.Panel1.Controls.GetChildIndex(InputControl);
int displayIndex = splitControl1.Panel1.Controls.GetChildIndex(Display);

这似乎是为我的两 (2) 个控件获取 z 索引的一种非常无益的方式。

除了编写我自己的代码来跟踪哪个控件位于顶部之外,是否有更简单的方法来解决这个问题?

我想要一些返回任何控件的 z-index 的 Microsoft 方法,无论该控件是直接子控件还是父控件的某种其他后代。答案首先授予知道这一点的人。

如果不存在,我将如何编写一个而不必创建递归循环?在没有现有的 Microsoft 方法的情况下,这将作为奖励答案。

如果需要递归循环,请指出(并可能回答)最佳递归循环。

4

2 回答 2

3

这个怎么样?

var inputIndex = InputControl.Parent.Controls.GetChildIndex(InputControl);
var displayIndex = Display.Parent.Controls.GetChildIndex(Display);
于 2013-06-06T16:04:04.310 回答
1

当您有 splitcontainer 或其他容器时,它们会收到基于父控件中的控件的 tabindex(例如:Form1)例如:Form1 带有 2 个按钮、1 个文本框和 splitcontainer - 取决于您放置它们的顺序或您是否编辑了它们的顺序。 .. button1 tabindex 为 0,button2 1,textbox 2,splitcontainer 3

现在,在 splitcontainer 内部,您有 2 个面板(1 和 2),它们接收正确的索引....splitcontainer.panel1 将收到 3,0 的 tabindex 和 splitcontainer.panel2 将是 3,1......现在每个里面您放置控件,因此它们的 tabindex 将是 3,0,0 或 3,0,1,具体取决于您内部有多少控件,但我认为您可以想象那些带有自己索引的容器,例如“Form”。

例如:int y = this.Controls.Find("Display", true).Single(x => x.Name == "Display").TabIndex;

这将获得控件所在的拆分容器面板内的索引。

迈克尔·冈特(Michael Gunter)的答案是正确的希望这会有所帮助

于 2013-06-06T16:39:35.917 回答