如何检查 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
的EventHandlerList
,这个事件处理程序列表没有公开,所以我们必须使用一点反射。获取 SelectedIndexChanged
事件处理程序的键在 ComboBox
类中保存为一个名为 EVENT_SELECTEDINDEXCHANGED
的字段,这个字段也是非公共的,所以我们也要用反射来获取它,一旦同时得到EventHanlderList
和SelectedIndexChanged
事件键,我们就可以检查在 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 -=
最好的选择是使用字典来存储控件和为其添加的事件。