如何检查ComboBox.selectedIndexChanged事件是否为null

时间:2013-12-19 05:20:11

标签: c# windows winforms c#-3.0

如何检查ComboBox.SelectIndexchanged事件是否没有任何方法。

这里我有一些方法可以在ComboBox中添加和使用Rovemo方法,这些方法可以用于任何组合框。

 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对象,而Method需要添加类似于Romove。

但问题是如果我单击一个comboBox两次,那么该方法将调用两次。 所以为了避免我正在检查ComboBox的selectedIndexChanged事件是否已经持有任何Mthod。如果是,那么代码将不再添加相同的方法。为此,我使用了If条件。但它显示错误。 我怎么能实现这个???

2 个答案:

答案 0 :(得分:1)

您的问题是您需要访问EventHandlerList的{​​{1}},此事件处理程序列表未公开显示,因此我们必须使用一点反思。获取ComboBox事件处理程序的关键字保存为SelectedIndexChanged类中的EVENT_SELECTEDINDEXCHANGED字段,此字段也是非公开的,因此我们还必须使用反射来得到它,一旦得到ComboBoxEventHanlderList事件键,我们可以检查传入SelectedIndexChanged索引器的密钥是否返回null,返回null意味着没有任何处理程序对于活动EventHandlerList

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

答案 1 :(得分:0)

您可以检查是否有任何处理程序附加到声明事件的类中的事件。如果您尝试在此处进行检查,您将获得以下内容:

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

您最好的选择是使用字典来存储控件和为其添加的事件。