Foreach over多个ControlCollections

时间:2012-01-01 23:51:19

标签: c# linq lambda foreach controlcollection

我的Windows窗体中有一个标签控件,我想在两个不同的标签中迭代每个元素。打开文件时,我希望启用两者的所有元素,当文件关闭时,全部禁用。

但是,我不知道如何实现这一点,因为控件不在数组或列表中,而是在ControlsCollection中。我在一秒钟之前询问过foreach语句,并对lambda有所了解,但我不知道如何在这里应用它。

这就是我所拥有的:

List<Control.ControlCollection> panels = new List<Control.ControlCollection>();
panels.Add(superTabControlPanel1.Controls);
panels.Add(superTabControlPanel2.Controls);
foreach(Control.ControlCollection ctrlc in panels){
    foreach (Control ctrl in ctrlc) { 

    }
}

这可能是一个foreach语句,还是更简单?

4 个答案:

答案 0 :(得分:4)

我会使用Linq,其中包含以下内容:

foreach (var ctrl in panels.SelectMany (x => x.Cast<Control> ())) {
     // Work with the control.
}

关键是在IEnumerable上使用Cast扩展方法使其可用于SelectMany。

答案 1 :(得分:1)

您是否知道如果禁用父控件,那么所有嵌套控件也会被禁用?简单地禁用两个选项卡面板也会禁用所有孩子。启用面板可以恢复效果。

我知道这不能回答你的问题,但这是一个更好的解决方案。

答案 2 :(得分:0)

我会做这样的事情:

List<Control> controls = new List<Control>();
controls.AddRange(superTabControlPanel1.Controls.GetControls());
controls.AddRange(superTabControlPanel2.Controls.GetControls());
foreach(Control ctrl in controls){
    //Do something
}

我目前没有VS方便,也不确定GetControls()是否存在。但是你可以使用一般的想法:代替面板集合,拥有一组控件,并在一个循环中迭代控件。

答案 3 :(得分:0)

我可能联合这两个集合并避免一起使用Generic List<T>

var controls = superTabControlPanel1.Controls.Union(superTabControlPanel2.Controls);

foreach (var control in controls) {
  //...
}

或者您可以将多个集合链接在一起。

var controls = 
  (superTabControlPanel1.Controls)
  .Union
  (superTabControlPanel2.Controls)
  .Union
  (superTabControlPanel3.Controls);