日期:2014-05-18  浏览次数:20650 次

关于获取容器内控件顺序的问题
假设Panel中从上到下有3个Button:Button1、Button2、Button3。

首先,我写了一个方法A:用foreach(Button ButtonName in Panel)的方法,将获取的Button全部放到一个Button[]数组中。此时查看Button[]数组,获取的Button在数组中的顺序是Button1、Button2、Button3。

然后我写了一个方法B,方法是用修改Location的办法交换了Button2和Button3的Location。

执行此方法,没问题,Button2和Button3在Panel中交换了位置。

再次执行方法A,问题来了,获取的Button在数组中的顺序依然是Button1、Button2、Button3。

问题1:再次执行A难道不应该是Button1、Button3、Button2吗?

问题2:怎样修改方法A才能获得Button1、Button3、Button2的顺序呢?

问题3:如何获取容器内指定位置的控件呢?

------解决方案--------------------
1.子窗口在父窗口Controls集合里面的顺序就是你添加进去时的顺序,和子窗口的Location无关。这个顺序决定的是控件部分或全部重叠时哪个控件显示在上面,也就是Z轴顺序(winform里面是索引值小的显示在上面)。很多框架以ZOrder,ZIndex之类名字把这个属性单独列出来了,Winform没有这么做。

2.自己写个IComparer或者相应的委托来排序


3.可以遍历找;也可以先用API ChildWindowFromPoint拿到句柄,然后通过Control.FromHandle获得相应的托管对象引用。

---------------------------
你要改子窗口在父窗口Controls集合中的索引也可以,ControlCollection(Control.Controls的类型)公开了GetChildIndex和SetChildIndex两个函数来获取和修改子窗口在父窗口controls集合中的索引。
不过要注意上面说的,这个索引值在winform中还充当了z层叠顺序的角色,你改这个值实际上在修改控件的z层叠顺序,改的时候要考虑到这一点。