Могу ли я отключить кнопку рядом с кнопкой, которую я нажимаю?

#c# #.net #winforms

Вопрос:

Я хотел бы отключить 2 кнопки одним щелчком мыши, не указывая эти кнопки. У меня в форме ~150 кнопок, и я не хочу писать функцию для всех из них.

У меня есть функция, похожая на эту, чтобы отключить кнопку, на которую я нажимаю.

 public void disableButton(object sender, EventArgs e)
{
    if (((Button)sender).Enabled == true)
    {
        ((Button)sender).Enabled = false;
        ((Button)sender).BackColor = Color.Red;
    }
}
 

Поэтому, в принципе, когда я вызываю эту функцию, я хотел бы отключить ЭТУ кнопку и кнопку рядом с ней. (Например, кнопки 1 и 2)

Комментарии:

1. Вам придется определить, что именно означает «рядом с этим». После того, как вы это сделаете, решение станет для вас очевидным.

2. Соответствуют ли названия кнопок какому-либо шаблону? Как вы на самом деле вычисляете / знаете, какая кнопка «рядом с ней», просто если вы нажмете кнопку 3, это будет кнопка 4? Если вы можете прояснить это, мы можем помочь в дальнейшем.

3. Если я нажму «Кнопка 1», «рядом с ней» появится «Кнопка 2″. Так что на самом деле да, у них есть закономерность. Всегда » 1″ с другой кнопки.

Ответ №1:

Учитывая, что кнопка должна быть добавлена в элемент управления в определенном порядке, чтобы, когда вы получите все кнопки в соответствии с вашими требованиями, вы могли отключить немедленную кнопку рядом с текущей кнопкой, пожалуйста, обратитесь к приведенному ниже коду:

 public void disableButton(object sender, EventArgs e)
{
           var selectedButton = ((Button)sender);
           var allButtons = Controls.OfType<Button>().ToList();
           var currentButtonIndex = allButtons.Select((s, i) => new { button = s, index = i }).Single(si => si.button.Name == selectedButton.Name).index;
           if (allButtons[currentButtonIndex   1].Enabled == true)
           {
               allButtons[currentButtonIndex   1].Enabled = false;
               allButtons[currentButtonIndex   1].BackColor = Color.Red;
           }
}
 

Чтобы получить список всех кнопок в вашей форме Controls.OfType<Button>().ToList() , следующим шагом является получение индекса текущей кнопки. Как только вы получите индекс, увеличьте его на 1, и вы получите ссылку на следующую кнопку
для более безопасной реализации, просто проверьте, не последняя ли это кнопка, в этом случае выберите первую кнопку, см. код ниже:

 currentButtonIndex = currentButtonIndex   1 >= allButtons.Count() ? 0 : currentButtonIndex;  
 

Предположим, вы не можете определить порядок кнопок , но следующая кнопка должна основываться на том TabStop , TabStop на основе чего вы можете лучше найти следующую кнопку, см. ниже код

 var allButtons = Controls.OfType<Button>().OrderBy(o => o.TabStop).ToList();
var currentButtonIndex =  allButtons.Select((s, i) => new { button = s, index = i }).Single(si => si.button.Name == selectedButton.Name).index;
var toDisableButton = allButtons[currentButtonIndex   1];
Controls.OfType<Button>().Single(si => si.Name == toDisableButton.Name).Enabled = false;
 

Ответ №2:

  1. Создайте коллекцию пар, где пара: (name_of_btn_1, name_of_btn_2).
    Это может быть IDictionary<string, string> .
  2. Внутри обработчика события щелчка получите связанное имя кнопки с помощью словаря. Тогда вы можете сделать это.Управления.Найдите (), чтобы получить соответствующую кнопку по имени и отключить ее.

Комментарии:

1. Не проще ли сохранить две ссылки на двух кнопках, а не словарь…?

2. Это ~150 кнопок, приятель. Кроме того, это всего лишь альтернативное решение. Ответ Амита лучше (при условии, что индексация находится в правильном порядке, но это можно исправить).