#c# #winforms
#c# #winforms
Вопрос:
У меня есть 100 кнопок в квадрате 10×10, они меняют цвет при нажатии.
private void alternateColor(Control ctrl)
{
switch (ctrl.BackColor.Name)
{
case "LightGray":
ctrl.BackColor = Color.LightBlue;
break;
default:
ctrl.BackColor = Color.LightGray;
break;
}
}
private void matrixButtonClick(object sender, MouseEventArgs e)
{
alternateColor(sender as Control);
}
Что я хочу кнопку, которая сбрасывает каждую кнопку, которая была изменена со светло-синего на светло-серый. Любая помощь была бы оценена
private void btnClear_Click(object sender, EventArgs e)
{
????
}
Комментарии:
1. С какой частью у вас возникли проблемы? Как найти кнопки?
2. Кстати, почему вы проверяете,
ctrl.BackColor.Name
когда вы можете просто проверитьctrl.BackColor
. То естьcase Color.LightGray:
…3. Кстати, вы могли бы написать
alternateColor
так:private void alternateColor(Control ctrl) { ctrl.BackColor = ctrl.BackColor == Color.LightGray ? Color.LightBlue : Color.LightGray; }
Ответ №1:
Вы можете использовать linq для фильтрации кнопок с определенным цветом задней панели. Вы можете использовать Enumerable.OfType для получения элементов управления типа button и использования Enumerable.Где метод для фильтрации кнопок с именем BackColor, равным LightBlue
//Get the button in form with LightBlue back color.
var formLightBlueButton = form1.Controls.OfType<Button>()
.Where(b=>b.BackColor == Color.LightBlue);
//Changing the color of buttons
foreach(var button in formLightBlueButton)
button.BackColor = Color.LightGray;
Использование цикла foreach для получения и установки свойств кнопки вместо использования LINQ кажется более подходящим редактирования здесь. Просто используйте is
operator для фильтрации кнопки и изменения цвета обратной стороны.
foreach(Control ctrl in this.Controls)
if (ctrl is Button amp;amp; ctrl.BackColor == Color.Maroon)
ctrl.BackColor = Color.LightGray;
Комментарии:
1. на самом деле вам не нужно фильтровать кнопки — они все равно получат одинаковый цвет — просто говорю
2. Просто чтобы убедиться, что он не должен получать кнопки, не удовлетворяющие условию, т. е. цвету. Светло-синий
Ответ №2:
Я мог бы придумать несколько подходов:
- выполните итерацию по дочерним элементам в конфигураторе, выберите каждую кнопку и верните ей цвет
- используйте событие / IObservable, на которое вы подписываетесь для каждой кнопки при создании и которое уведомляет кнопки об измененном цвете
- улучшить на 2 с помощью viewmodel (MVVM)
Список отсортирован по сложности, но более поздние дают вам лучший дизайн, и в зависимости от вашей проблемы я бы посоветовал как минимум 2
PS: Я не могу дать вам осмысленный код, не имея ни малейшего представления о том, что вы там на самом деле делаете — если я смогу увидеть больше вашего кода / определений, я добавлю некоторые.