Как я могу создать только один метод обработчика событий для нескольких элементов управления? - PullRequest
0 голосов
/ 17 июля 2011

У меня есть 15 comboBox'ов, и я не хочу создавать обработчик событий для каждого.Как мне сделать всего одну процедуру и привязать к ней все 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);

Ответы [ 4 ]

3 голосов
/ 17 июля 2011

Вы можете присвоить каждому 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);
}

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

1 голос
/ 17 июля 2011

Я бы порекомендовал один обработчик событий для всех 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 голосов
/ 17 июля 2011

Свяжите каждый элемент в вашей разметке с тем же 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 голосов
/ 17 июля 2011

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

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

...