Foreach для нескольких ControlCollections

У меня есть элемент управления вкладками в моей форме 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 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Или вы можете объединить несколько коллекций вместе.

var controls = 
  (superTabControlPanel1.Controls)
  .Union
  (superTabControlPanel2.Controls)
  .Union
  (superTabControlPanel3.Controls);
Другие вопросы по тегам