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);