Вы можете выбрать все элементы управления определенного типа, используя метод расширения System.Linq
, OfType
, и, если вы перебираете их в цикле, вы можете установить все их свойства BackColor
:
private void button1_Click(object sender, EventArgs e)
{
ColorDialog cd = new ColorDialog();
if (cd.ShowDialog() == DialogResult.OK)
{
foreach (var panel in Controls.OfType<Panel>())
{
panel.BackColor = cd.Color;
}
}
}
Обратите внимание, что это только перебирает элементы управления, принадлежащие непосредственно самой форме.Если какая-либо из панелей находится внутри элемента управления контейнера, то нам нужно просмотреть каждый элемент управления, чтобы увидеть, содержит ли он какие-либо панели.
Мы можем написать вспомогательный метод для этого, который потребует Control
для проверки, Color
для использования для BackColor
и Type
, который определяет тип элемента управления, который мы хотимустановите цвет спины для.
Затем мы сначала проверяем, является ли Control
того же типа, что и тот, который мы ищем, и, если это так, устанавливаем его задний цвет.После этого мы перебираем все его дочерние элементы и рекурсивно вызываем метод снова для них.Таким образом, если мы передадим родительскую форму как Control
, мы переберем все элементы управления:
private void SetBackColorIncludingChildren(Control parent, Color backColor, Type controlType)
{
if (parent.GetType() == controlType)
{
parent.BackColor = backColor;
}
foreach(Control child in parent.Controls)
{
SetBackColorIncludingChildren(child, backColor, controlType);
}
}
private void button1_Click(object sender, EventArgs e)
{
ColorDialog cd = new ColorDialog();
if (cd.ShowDialog() == DialogResult.OK)
{
// Pass 'this' to the method, which represents this 'Form' control
SetBackColorIncludingChildren(this, cd.Color, typeof(Panel));
}
}