ArgumentException & # 39;孩子# 39;不是父控件的子控件

本文关键字:控件 孩子 ArgumentException | 更新日期: 2023-09-27 18:17:10

我有一个Windows窗体与SplitContainer。在这个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,无论该控件是一个直接的子控件还是父控件的某种其他后代。答案首先会被授予知道答案的人。

如果它不存在,我如何在不创建递归循环的情况下编写一个呢?在没有现有的微软方法的情况下,这将作为被授予的答案。

如果需要递归循环,则指向(可能还有答案)最佳递归循环。

ArgumentException & # 39;孩子# 39;不是父控件的子控件

这个怎么样?

var inputIndex = InputControl.Parent.Controls.GetChildIndex(InputControl);
var displayIndex = Display.Parent.Controls.GetChildIndex(Display);

当您有splitcontainer或其他容器时,它们接收tabindex基于父控件中的控件(例如:Form1)示例:Form1有2个按钮,1个文本框和splitcontainer-这取决于你给他们下的订单,或者你是否编辑了他们的订单…Button1 tabindex = 0,button2 tabindex = 1,textbox = 2,splitcontainer = 3

现在,在splitcontainer内,您有2个面板(1和2)接收它们的适当的索引的文档。Panel1的tabindex为3,0和文档。第二组是3,1......在每个控件中,它们的tabindex会是3,0,0或者3,0,1这取决于里面有多少个控件但我想你们已经明白了想想那些有自己索引的容器,比如"Form"。

ex: int y = this.Controls。找到("显示",真正的)。Single(x => x. name == "Display").TabIndex;

这将获得该控件的splitcontainer面板内的索引是。

Michael Gunter的答案是正确的