Как написать обработчики событий для нескольких похожих элементов управления? - PullRequest
1 голос
/ 08 февраля 2011

В принципе, у меня есть определенные элементы управления, где они делают похожие вещи, но для разных элементов управления, использующих разные значения. Например:

public static void DeleteItemsFromList ( object sender, EventArgs e )
{
    ListBox control = null;
    switch ( ( ( Button ) sender ).Name )
    {
        case "EffectsRemove": control = ( ListBox ) ActiveForm [ "EffectsList" ]; break;
        case "LayersRemove": control = ( ListBox ) ActiveForm [ "LayersList" ]; break;
        case "ObjectsRemove": control = ( ListBox ) ActiveForm [ "ObjectsList" ]; break;
    }

    control.Items.Add ( ( ( Button ) sender ).Name )

    string action = null;
    switch ( ( ( CheckButton ) sender ).Name )
    {
        case "EffectsRemove": action = "Effects"; break;
        case "LayersRemove": action = "Layers"; break;
        case "ObjectsRemove": action = "Objects"; break;
    }

    var selectedItem = control.SelectedItem;
    if ( selectedItem == null )
        return;

    Refresh = false;
    UpdateUI ( action );
    Refresh = true;
}

Это плохая практика? Есть ли лучший способ сделать такого рода обработчики событий переменных, основанные на аналогичных элементах управления?

Ответы [ 4 ]

2 голосов
/ 08 февраля 2011

Лично я считаю, что ваш пример оставляет слишком много возможностей для ошибки.Лучше всего было бы извлечь общую функциональность для отдельного метода.

public static void EffectsRemove_Click(object sender, EventArgs e)
{
    DeleteItemsFromList(
        (Button)sender, 
        (ListBox)ActiveForm["EffectsList"], 
        "Effects");
}

public static void LayersRemove_Click(object sender, EventArgs e)
{
    DeleteItemsFromList(
        (Button)sender, 
        (ListBox)ActiveForm["LayersList"], 
        "Layers");
}

public static void ObjectsRemove_Click(object sender, EventArgs e)
{
    DeleteItemsFromList(
        (Button)sender, 
        (ListBox)ActiveForm["ObjectsList"], 
        "Objects");
}

public static void DeleteItemsFromList(
    Button sender, 
    ListBox control, 
    string action)
{
    control.Items.Add(sender.Name);

    var selectedItem = control.SelectedItem;
    if ( selectedItem == null )
        return;

    Refresh = false;
    UpdateUI action;
    Refresh = true;
}
1 голос
/ 09 февраля 2011

Возможно, вы захотите рассмотреть возможность использования пользовательского элемента управления, где вы можете получить из Button и добавить несколько свойств для каждого экземпляра CustomButton, представляющих интересующую вас строку и ListBox.Затем вы можете привязать каждую кнопку к одному и тому же обработчику событий и воздействовать на свойства CustomButton, не заботясь о том, какая это кнопка.

1 голос
/ 09 февраля 2011

Вот еще один подход, который вы можете использовать через некоторые делегаты, определенные при подписке на EventHandler.Я думаю, что это немного легче читать таким образом, но может выйти из-под контроля, если вы добавите несколько других условий (например, RichTextBox, Combobox и т. Д.)

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.Click += new EventHandler(delegate { DoButtonProcessing(this, "EffectsList", null); });
        button2.Click += new EventHandler(delegate { DoButtonProcessing(this, "LayersList", null); });

        button3.Click += new EventHandler(delegate { DoButtonProcessing(this, null, "Effects"); });
        button4.Click += new EventHandler(delegate { DoButtonProcessing(this, null, "Layers"); });
    }

    void DoButtonProcessing(object sender, string list, string action)
    {
        ListBox control = (ListBox)ActiveForm[list]; //can be null here, but your source also allowed that so I assume it's just a snippit.
        control.Items.Add(((Button)sender).Name);
        var selectedItem = control.SelectedItem;
        if (selectedItem == null) return;
        Refresh = false;
        UpdateUI null;
        Refresh = true;

    }
1 голос
/ 08 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...