【发布时间】:2018-06-08 16:31:20
【问题描述】:
短版
在我的抽象类MyCbo_Abstract(派生自ComboBox 类)中,我想创建一个自定义属性,当设置该属性时将减去所有控件的事件处理程序,设置基本属性值,然后重新添加所有控件的事件处理程序。
我目前所拥有的
我有一个具体的ComboBox 类派生自一个抽象的ComboBox 类,该类派生自微软的ComboBox 类。
public abstract class MyCbo_Abstract : ComboBox
{
public MyCbo_Abstract() : base()
{
}
}
public partial class MyCboFooList : MyCbo_Abstract
{
public MyCboFooList() : base()
{
}
}
我的主要Form 类订阅某些基本ComboBox 事件。
注意:设计师有:this.myCboFooList = new MyCboFooList();
public partial class FormMain : Form
{
public FormMain()
{
myCboFooList.SelectedIndexChanged += myCboFooList_SelectedIndexChanged;
}
private void myCboFooList_SelectedIndexChanged(object sender, EventArgs e)
{
// do stuff
}
}
有时我想禁止调用已定义的事件处理程序,例如,当我以编程方式设置 ComboBox 对象的 SelectedIndex 属性时。
每次我想修改 SelectedIndex 属性并抑制其事件时,我不必记住编写代码来减去和重新添加事件处理程序,而是想创建一个自定义属性SelectedIndex_NoEvents,当设置时将减去所有控件的事件处理程序,设置基本属性值SelectedIndex,然后重新添加所有控件的事件处理程序。
问题
我的问题是我不知道如何迭代 EventHandlerList,因为它没有 GetEnumerator。而且,在调试器中查看列表时,saveEventHandlerList 是一个奇怪的链式东西,我无法弄清楚如何遍历。
public abstract class MyCbo_Abstract : ComboBox
{
int selectedIndex_NoEvents;
public int SelectedIndex_NoEvents
{
get
{
return base.SelectedIndex;
}
set
{
EventHandlerList saveEventHandlerList = new EventHandlerList();
saveEventHandlerList = Events;
//foreach won't work - no GetEnumerator available. Can't use for loop - no Count poprerty
foreach (EventHandler eventHandler in saveEventHandlerList)
{
SelectedIndexChanged -= eventHandler;
}
base.SelectedIndex = value;
//foreach won't work - no GetEnumerator available. Can't use for loop - no Count poprerty
foreach (EventHandler eventHandler in saveEventHandlerList)
{
SelectedIndexChanged += eventHandler;
}
saveEventHandlerList = null;
}
}
//Probably don't need this
public override int SelectedIndex
{
get
{
return base.SelectedIndex;
}
set
{
base.SelectedIndex = value;
}
}
public DRT_ComboBox_Abstract() : base()
{
}
}
【问题讨论】:
-
您应该能够使用此处描述的类似技术:stackoverflow.com/questions/91778/…
-
@BradleyUffner: How to remove all event handlers from an event 在球场上,但它只删除了一类事件(在他的例子中是 Click 事件)。最后,无论类别如何,我都需要删除然后重新添加所有控件的事件处理程序:Click、SelectedIndexChanged、TextChanged 等。最重要的是,我不想修改自定义属性的 Set每次为控件订阅新事件类别时的代码
-
您可以使用反射来循环所有事件。
-
除了
Events类与EventHandlerList类有相同的问题,即没有GetEnumerator 之外,这将起作用。所以,Events类的同样问题 -
我很确定这一切都可以通过反射来解决。给我几分钟的时间来弄清楚细节,我会回来报告的。
标签: c# winforms loops eventhandler