2011-02-08 50 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的屬性執行操作,而不必關心它是哪一個。

相關問題