如何检查 ComboBox.selectedIndexChange 事件是否为空

本文关键字:事件 selectedIndexChange 是否 ComboBox 何检查 检查 | 更新日期: 2024-11-01 03:45:48

如何检查ComboBox.SelectIndexchanged Event是否不保存任何方法。

在这里,我有方法可以在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;
       }
   }

如果我想添加一个方法意味着简单地调用这个添加方法并传递 CmoboBox 对象和方法需要添加类似于 Romove。

但这里的问题是,如果我单击组合框两次,那么该方法将调用两次。所以为了避免我正在检查组合框的 selectedIndexChanged 事件是否已经包含任何 Mthod。如果是,则代码将不会再次添加相同的方法。为此,我使用了 If 条件。但它显示错误。我怎样才能做到这一点???

如何检查 ComboBox.selectedIndexChange 事件是否为空

你的问题是你需要访问ComboBoxEventHandlerList,这个事件处理程序列表没有公开,所以我们必须使用一点反射。获取 SelectedIndexChanged 事件处理程序的键在 ComboBox 类中保存为一个名为 EVENT_SELECTEDINDEXCHANGED 的字段,这个字段也是非公共的,所以我们也要用反射来获取它,一旦同时得到EventHanlderListSelectedIndexChanged事件键,我们就可以检查在 EventHandlerList 的索引器中传递的那个键是否返回 null, 返回 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
}
好吧,

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

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

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