2011-07-17 1 views
0

У меня есть 15 comboBox'es, и я не хочу создавать обработчик событий для каждого. Как сделать только одну процедуру и связать все Combobox'ах с ней?Как создать только один метод обработчика событий для нескольких элементов управления?

private void cbSlots0_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var item = ConfigClass.Slots["0"][cbSlots0.SelectedIndex]; 
    ConfigClass.Slots["0"].Insert(0, item); 
    ConfigClass.Slots["0"].RemoveAt(cbSlots0.SelectedIndex + 1); 
} 

private void cbSlots1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var item = ConfigClass.Slots["1"][cbSlots1.SelectedIndex]; 
    ConfigClass.Slots["1"].Insert(1, item); 
    ConfigClass.Slots["1"].RemoveAt(cbSlots1.SelectedIndex + 1); 
} 

Правильный ответ:

var cb = ((ComboBox)sender); 
      var tag = int.Parse(cb.Tag.ToString()); 
      var item = ConfigClass.Slots[tag.ToString()][cb.SelectedIndex]; 
      ConfigClass.Slots[tag.ToString()].Insert(tag, item); 
      ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex + 1); 
+0

возможно дубликат ([Установить единый обработчик событий для нескольких кнопок в .NET?] http://stackoverflow.com/questions/4157851/set-up-single-event-handler-for-multiple-buttons-in-net), [C# повторное использование обработчика событий хорошая практика] (http://stackoverflow.com/ вопросы/641365/C повторное использование событийно-ч andler-good-practice) –

+0

@ Коди Серый, почти – Mediator

ответ

3

Вы можете дать каждому ComboBox особым Tag, который содержит номер записи в ConfigClass, а затем использовать это как так:

private void cbSlots0_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int tag = (int)((ComboBox)sender).Tag; 
    var item = ConfigClass.Slots[tag.ToString()][cbSlots0.SelectedIndex]; 
    ConfigClass.Slots[tag.ToString()].Insert(tag, item); 
    ConfigClass.Slots[tag.ToString()].RemoveAt(cbSlots0.SelectedIndex + 1); 
} 

тега может содержать любые данные, которые вы хотите, так что если вы нужно что-то более сложное в нем, это тоже возможность.

0

Это относительно просто. Вы создаете один метод обработки событий SelectedIndexChanged, а затем подключаете его ко всем элементам управления со списком.

То, как вы проводите различие между элементами управления внутри метода во время выполнения, является проверка значения параметра sender. Вам нужно будет применить его к элементу управления ComboBox, но это безопасно, поскольку вы знаете, что вы не подключили какие-либо элементы управления, отличные от combobox, для этого обработчика событий. Затем вы сможете получить доступ ко всем свойствам выпадающего списка, которые подняли событие, которое вы обрабатываете.

1

Я бы порекомендовал одного обработчик события для все ComboBoxes. После этого, в обработчике события, используйте ссылку отправителя, чтобы решить, какой слот для использования:

private void allComboBoxesSelectedIndesChanged(object sender, EventArgs e) 
{ 
    int index = 0; // Or string as you have shown in your example. 

    if (sender == cbSlots0) 
     index = 0; 
    else if (sender == cbSlots1)  
     index = 1; 
    /// And so on for any other comboBox 

    var item = ConfigClass.Slots[index][((ComboBox) sender).SelectedIndex]; 
    ConfigClass.Slots[index].Insert(index, item); 
    ConfigClass.Slots[index].RemoveAt(((ComboBox) sender).SelectedIndex +1); 
} 
+0

-1: Эта большая, если/else if/... структура будет болью для поддержания. Было бы лучше с отдельными обработчиками событий, передающими индекс на общий общий метод. (Но в этом случае использование «Control.Tag» является эффективным подходом.) – Richard

+0

thx для подсказки! –

0

Tie каждый пункт в разметке к тому же SelectedIndexChangedEvent и брось отправителя в качестве элемента. Итак, в вашем коде найдите все уникальные имена событий (например, cbSlots0_SelectedIndexChanged, cbSlots1_SelectedIndexChanged и т. Д.) И переименуйте их в одно имя события (например, cbSlotsSelectedIndexChanged).

Я думаю, что это правильно. Проверьте.

КОД:

private void cbSlotsSelectedIndexChanged(object sender, EventArgs e) 
{ 
    ComboBox cBox = (ComboBox) sender; 
    int tag = (int)cBox.Tag; 
    var item = ConfigClass.Slots[tag.ToString()][cBox.SelectedIndex]; 
    ConfigClass.Slots[tag.ToString()].Insert(tag, item); 
    ConfigClass.Slots[tag.ToString()].RemoveAt(item.SelectedIndex + 1); 
} 

UPDATE: Я пересмотрел свой пост по просьбе

private void cbSlotsSelectedIndexChanged(object sender, EventArgs e) 
{ 
    var cb = ((ComboBox)sender); 
    var tag = int.Parse(cb.Tag.ToString()); 
    var item = ConfigClass.Slots[tag.ToString()][cb.SelectedIndex]; 
    ConfigClass.Slots[tag.ToString()].Insert(tag, item); 
    ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex + 1); 
} 
+0

Хорошо, но, пожалуйста, отредактируйте сообщение. var cb = ((ComboBox) отправитель); var tag = int.Parse (cb.Tag.ToString()); var item = ConfigClass.Slots [tag.ToString()] [cb.SelectedIndex]; ConfigClass.Slots [tag.ToString()]. ​​Вставить (тег, элемент); ConfigClass.Slots [tag.ToString()]. ​​RemoveAt (cb.SelectedIndex + 1); – Mediator

Смежные вопросы