如何检查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条件。但它显示错误。 我怎么能实现这个???
答案 0 :(得分:1)
您的问题是您需要访问EventHandlerList
的{{1}},此事件处理程序列表未公开显示,因此我们必须使用一点反思。获取ComboBox
事件处理程序的关键字保存为SelectedIndexChanged
类中的EVENT_SELECTEDINDEXCHANGED
字段,此字段也是非公开的,因此我们还必须使用反射来得到它,一旦得到ComboBox
和EventHanlderList
事件键,我们可以检查传入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 -=
您最好的选择是使用字典来存储控件和为其添加的事件。