Попытка создать кнопку, которая сбросит фоновые цвета всех других кнопок

#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:

Я мог бы придумать несколько подходов:

  1. выполните итерацию по дочерним элементам в конфигураторе, выберите каждую кнопку и верните ей цвет
  2. используйте событие / IObservable, на которое вы подписываетесь для каждой кнопки при создании и которое уведомляет кнопки об измененном цвете
  3. улучшить на 2 с помощью viewmodel (MVVM)

Список отсортирован по сложности, но более поздние дают вам лучший дизайн, и в зависимости от вашей проблемы я бы посоветовал как минимум 2

PS: Я не могу дать вам осмысленный код, не имея ни малейшего представления о том, что вы там на самом деле делаете — если я смогу увидеть больше вашего кода / определений, я добавлю некоторые.