Foreach для нескольких ControlCollections - PullRequest
4 голосов
/ 02 января 2012

В моей форме Windows есть элемент управления вкладками, и я хочу перебирать каждый элемент на двух разных вкладках. Когда файл открыт, я хочу, чтобы все элементы обоих были включены, а когда файл закрыт, все должны быть отключены.

Однако я понятия не имею, как этого добиться, потому что элементы управления находятся не в массиве или списке, а в ControlsCollection. Я спросил секунду назад о выражениях foreach и немного узнал о лямбде, но я не знаю, как я могу применить это здесь.

Вот что у меня есть:

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 голосов
/ 02 января 2012

Я бы использовал Linq со следующим:

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

Ключом является использование метода расширения Cast в IEnumerable, чтобы сделать его пригодным для использования с SelectMany.

1 голос
/ 03 января 2012

Знаете ли вы, что если вы отключите родительский элемент управления, то все вложенные элементы управления тоже отключатся?Простое отключение двух вкладок также приведет к отключению всех дочерних элементов.Включение панели отменяет эффект.

Я знаю, что это не ответит на ваш вопрос, но это лучшее решение.

0 голосов
/ 03 января 2012

Я бы, вероятно, объединил две коллекции и не использовал бы общий List<T> все вместе.

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

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

Или вы можете связать несколько коллекций вместе.

var controls = 
  (superTabControlPanel1.Controls)
  .Union
  (superTabControlPanel2.Controls)
  .Union
  (superTabControlPanel3.Controls);
0 голосов
/ 02 января 2012

Я бы сделал что-то вроде этого:

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 ().Но вы можете использовать общую идею: вместо набора панелей иметь набор элементов управления и выполнять итерации по элементам управления в одном цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...