ArgumentException' child'不是这个父母的孩子控制

时间:2013-06-06 15:56:02

标签: c# winforms visual-studio-2010

我有一个SplitContainer的Windows表单。其中SplitContainer是其他小组。

Panel1包含一个名为InputControl的自定义控件和一个名为Display的{​​{3}}。

要找出当前显示的项目,我转向TextBox并使用Windows窗体作为父级:

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

当我对此进行编码时,我不确定是否可以将Windows窗体作为父窗口传递,因此我之后设置了一个断点来检查两个索引是否大于-1:

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

但是,在为第一个整数inputIndex分配一个值之前,我已经为此GetChildIndex Method获得了此消息:

  

'child'不是该父母的子女控制。

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

另一方面,ArgumentException肯定是直接的儿童控制。那么,我应该搜索SplitContainer控件吗?

从技术上讲,我希望z-index的控件位于SplitContainer控件中。这是否意味着我的代码必须看起来很难看?

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

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

除了编写自己的代码以跟踪哪个控件位于顶部之外,还有一种更简单的方法吗?

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

如果不存在,我怎么写一个而不必创建递归循环?如果没有现有的Microsoft方法,这将作为获奖答案。

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

2 个答案:

答案 0 :(得分:3)

这个怎么样?

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

答案 1 :(得分: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”这样的容器。

ex:int y = this.Controls.Find(“Display”,true).Single(x =&gt; x.Name ==“Display”)。TabIndex;

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

迈克尔冈特的回答是正确的 希望这会有所帮助