2011-02-08 27 views
1

基本上我有一些控制他们做类似的事情,但对于不同的控制使用不同的值。例如:如何为多个类似的控件编写事件处理程序?

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

这是不好的做法?基于类似行为的控件,有没有更好的方法来完成这些类型的可变事件处理程序?

+2

男人,间隔圆括号约定是我永远无法理解的东西。 – ChaosPandion 2011-02-08 20:52:34

+0

@ChaosPandion:你的意思是阅读或写作? :O因为VS为我做。 – 2011-02-08 20:56:31

回答

1

我可以看到你想要重用逻辑的愿望,但在我看来这种做法使得代码更加脆弱和难以维护,在这种情况下,即使代码是伪的-类似。

2

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

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

这是另一种方法,您可以通过订阅EventHandler时定义的某些代理来使用。我认为这是一个有点易于阅读这种方式,但可能会失控,如果你增加了若干其他条件(例如,如果RichTextBox中,如果组合框等)

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

你可能要考虑使用自定义控制,你可以从Button派生出来,并为你的CustomButton的每个实例添加一些属性,代表你关心的字符串和列表框。然后,您可以将每个按钮绑定到相同的事件处理程序,并对CustomButton的属性执行操作,而不必关心它是哪一个。

相关问题