2013-12-19 25 views
0

如何檢查ComboBox.SelectIndexchanged事件是否不包含任何方法。如何檢查ComboBox.selectedIndexChange事件是否爲空

在這裏,我有方法來添加和Rovemo方法和ComboBox可以爲任何組合框服務。

public static void AddMethodToComoBox(EventHandler MetodName, ComboBox cbm) 
    { 
     if(cbm.SelectedIndexChanged==null) 
     { 
     cm.SelectedIndexChanged += MetodName; 
     } 

    } 
    public static void RemoveMethodToComoBox(EventHandler MetodName, ComboBox cbm) 
    { 
     if (cbm.SelectedIndexChanged != null) 
     { 
      cbm.SelectedIndexChanged -= MetodName; 
     } 

    } 

如果我想添加一個方法只是意味着我將這個add方法,並通過CmoboBox對象和方法需要同樣加入移去那些所謂。

但這裏的問題是,如果我點擊一個組合框兩次然後該方法將調用兩次。 所以爲了避免我檢查ComboBox的selectedIndexChanged事件是否已經持有任何方法。如果是,那麼代碼將不會再次添加相同的方法。爲此我使用了If條件。但它顯示錯誤。 我該如何做到這一點?

+0

修復您的邏輯。確保事件註冊/註銷僅被調用一次。即使可能,您的解決方案也無法正常工作,因爲無法將多個處理程序連接到相同的組合框。 – PMF

回答

0

那麼你可以檢查是否有任何處理程序連接到事件聲明的類中的事件。如果你試圖在這裏做一個檢查,你會得到這樣的:

The event SelectedIndexChanged can only appear on the left hand side of += or -= 

你最好的選擇是有一本字典存儲控制,並增加了它的事件。

1

您的問題是您需要訪問ComboBoxEventHandlerList,此事件處理程序列表未公開公開,所以我們必須使用一點反思。獲取SelectedIndexChanged事件的處理程序的關鍵字在ComboBox類中保存爲名爲EVENT_SELECTEDINDEXCHANGED的字段,該字段也是非公開的,因此我們還必須使用反射來獲取它,一旦同時獲得EventHanlderListSelectedIndexChanged事件關鍵字我們可以檢查是否在EventHandlerList返回索引是關鍵傳球空或不是,返回null表示沒有爲事件SelectedIndexChanged任何處理程序:

//Get the field EVENT_SELECTEDINDEXCHANGED 
var eventSelectedIndexChangedKey = typeof(ComboBox).GetField("EVENT_SELECTEDINDEXCHANGED", 
            System.Reflection.BindingFlags.NonPublic | 
            System.Reflection.BindingFlags.Static) 
            .GetValue(comboBox1); 
//Get the event handler list of the comboBox1 
var eventList = typeof(ComboBox).GetProperty("Events", 
           System.Reflection.BindingFlags.NonPublic | 
           System.Reflection.BindingFlags.Instance) 
           .GetValue(comboBox1, null) as EventHandlerList; 
//check if there is not any handler for SelectedIndexChanged 
if(eventList[eventSelectedIndexChangedKey] == null){ 
    //.... 
} else { 
    //.... 
} 

不過,我覺得你的問題是隻是爲了避免增加複製(或兩次)事件SelectedIndexChanged的處理程序,因此您始終可以在分配之前先嚐試註銷處理程序,但不會拋出異常:

public static void AddMethodToComoBox(EventHandler MetodName, ComboBox cbm) 
{ 
    cm.SelectedIndexChanged -= MethodName; 
    cm.SelectedIndexChanged += MethodName; 
} 
public static void RemoveMethodToComoBox(EventHandler MetodName, ComboBox cbm) 
{ 
    cbm.SelectedIndexChanged -= MetodName;//won't never throw exception 
}