4

我的 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

4 回答 4

4

我会使用 Linq,具有以下内容:

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

关键是在 IEnumerable 上使用Cast扩展方法,使其可与 SelectMany 一起使用。

于 2012-01-02T00:06:56.357 回答
1

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

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

于 2012-01-03T07:29:30.903 回答
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() 是否存在。但是你可以使用一般的想法:而不是面板的集合,有一个控件的集合,并在一个循环中遍历控件。

于 2012-01-02T00:12:09.807 回答
0

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

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

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

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

var controls = 
  (superTabControlPanel1.Controls)
  .Union
  (superTabControlPanel2.Controls)
  .Union
  (superTabControlPanel3.Controls);
于 2012-01-03T06:59:06.850 回答