C# 如何为多个类似控件编写事件处理程序?

C# 如何为多个类似控件编写事件处理程序?,c#,.net,winforms,events,C#,.net,Winforms,Events,基本上,我有一些控件,它们做相似的事情,但不同的控件使用不同的值。例如: public static void DeleteItemsFromList ( object sender, EventArgs e ) { ListBox control = null; switch ( ( ( Button ) sender ).Name ) { case "EffectsRemove": control = ( ListBox ) ActiveForm [

基本上,我有一些控件,它们做相似的事情,但不同的控件使用不同的值。例如:

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;
}

这是坏习惯吗?有没有更好的方法可以基于行为相似的控件来执行这些类型的变量事件处理程序?

我可以看出您希望重用逻辑,但在我看来,这种方法使代码更脆弱,更难维护,在这种情况下,我可能更倾向于使用单独的偶数处理程序,即使代码是伪相似的

我可以看出您希望重用逻辑,但在我看来,这种做法会使代码更脆弱,更难维护。在这种情况下,我可能倾向于使用单独的偶数处理程序,即使代码是伪相似的

就我个人而言,我发现你的例子留下了太多出错的机会。您最好将通用功能提取到一个单独的方法中

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;
}

就我个人而言,我发现你的例子给错误留下了太多的机会。您最好将通用功能提取到一个单独的方法中

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;
}

下面是另一种方法,您可以通过订阅EventHandler时定义的一些委托来使用。我认为这样读起来容易一些,但是如果你添加了几个其他条件(比如if RichTextBox、if Combobox等),可能会失控


下面是另一种方法,您可以通过订阅EventHandler时定义的一些委托来使用。我认为这样读起来容易一些,但是如果你添加了几个其他条件(比如if RichTextBox、if Combobox等),可能会失控


您可能想考虑使用自定义控件,在这里您可以从按钮派生,并向Cuutton按钮的每个实例添加一些属性,表示您关心的字符串和列表框。然后,您可以将每个按钮绑定到同一事件处理程序,并对Cuutton按钮的属性进行操作,而不必关心它是哪一个。

< P>您可能需要考虑使用自定义控件,在这里您可以从按钮派生,并向Cuutton按钮的每个实例添加一些属性,表示您关心的字符串和列表框。然后,您可以将每个按钮绑定到同一个事件处理程序,并对CustomButton的属性进行操作,而不必关心它是哪一个。

伙计,我永远无法理解间隔括号约定。@chaospantion:您是指读还是写因为VS帮了我。我可能错了,但我认为这是解决问题的方法go@ChaosPandion:我非常喜欢这种风格,因为它让我用肉眼解析代码的速度更快。就像我可以立即看到事物,而不是试图单独剖析它们一样。@Joan-这种东西几乎总是与你最初接触编程的方式有关。我的大脑经过训练,可以在特定的地方使用括号。知道了这一点,我就可以很容易地把它们过滤掉作为噪音,并解析出基本的逻辑。老兄,我永远也搞不懂间隔括号的约定。@ChaosPandion:你是说读还是写因为VS帮了我。我可能错了,但我认为这是解决问题的方法go@ChaosPandion:我非常喜欢这种风格,因为它让我用肉眼解析代码的速度更快。就像我可以立即看到事物,而不是试图单独剖析它们一样。@Joan-这种东西几乎总是与你最初接触编程的方式有关。我的大脑经过训练,可以在特定的地方使用括号。知道了这一点,我可以很容易地将它们作为噪声过滤掉,并解析底层逻辑。谢谢,这很有趣。但是如果解析逻辑在更多的地方呢。就像解析,普通逻辑,解析,普通逻辑,解析,普通逻辑,等等?@Joan-显然,我所说的需要逐案考虑。我一直认为有一条经验法则很有用,那就是“避免过多的条件语句”。谢谢,这很有趣。但是如果解析逻辑在更多的地方呢。就像解析,普通逻辑,解析,普通逻辑,解析,普通逻辑,等等?@Joan-显然,我所说的需要逐案考虑。我一直认为有一条经验法则很有用,那就是“避免过多的条件语句”。