#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:
- Создайте коллекцию пар, где пара: (name_of_btn_1, name_of_btn_2).
Это может бытьIDictionary<string, string>
. - Внутри обработчика события щелчка получите связанное имя кнопки с помощью словаря. Тогда вы можете сделать это.Управления.Найдите (), чтобы получить соответствующую кнопку по имени и отключить ее.
Комментарии:
1. Не проще ли сохранить две ссылки на двух кнопках, а не словарь…?
2. Это ~150 кнопок, приятель. Кроме того, это всего лишь альтернативное решение. Ответ Амита лучше (при условии, что индексация находится в правильном порядке, но это можно исправить).