假设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.   

    1、你的方法A获取的应该是buttion的建立顺序,而不是按location
    2、数组里顺序你自己可以调整,和location的顺序两回事
    3、按创建顺序取
      

  2.   

    foreach(Button ButtonName in Panel)打错了,应该是foreach(Button ButtonName in Panel.Controls)
      

  3.   


    那能修改Button的创建顺序吗?因为如果控件多了,交换位置每次都要读取控件的顺序,数组是临时的,用完就回收了。
      

  4.   

    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层叠顺序,改的时候要考虑到这一点。
      

  5.   

    不知道你具体要这个顺序做什么用,单单看你的问题,你可以这样做
    创建一个Dictionary,用来保存button.Name与button顺序的键值对,每次变换location的时候,同样变换这个Dictionary