如何在C#中覆盖WinForm UserControl中的方法和事件?
我在C#WinForms中有一个名为BaseControl
,我有一个名为Selected
的属性。
我希望在基本控件中有一个事件SelectedChanged
和虚方法OnSelecteChanged
,它们的行为应该与我们在Control
类中对许多属性的行为相同,即Click
事件和OnClick
方法。
意味着从我的BaseControl
派生的任何人都可以绑定到事件或者可以覆盖OnSelectedChanged
方法。
因此,当Selected
属性的值被更改时,应该触发事件,如果方法被覆盖,则控制应该转到该方法。
我知道如何解雇事件,但不知道如何做方法。
请指导我……
以下是如何实施事件的示例:
public class BaseControl : Control { private object _selected; public object Selected { get { return _selected; } set { if (!Equals(_selected, value)) { _selected = value; OnSelectedChanged(EventArgs.Empty); } } } public event EventHandler SelectedChanged; protected virtual void OnSelectedChanged(EventArgs e) { if (SelectedChanged != null) SelectedChanged(this, e); } }
在这个例子中,您可以覆盖覆盖类中的OnSelectedChanged
,如下所示:
public class MyControl : BaseControl { protected override void OnSelectedChanged(EventArgs e) { base.OnSelectedChanged(e); // My own logic. } }
private bool _selected; public bool Selected { get { return _selected; } set { if (value != _selected) { _selected = value; OnSelectedChanged(); } } } public event EventHandler SelectedChanged; protected virtual void OnSelectedChanged() { var handler = SelectedChanged; if (handler != null) handler(this, EventArgs.Empty); }
基本上,您不会从Selected
属性设置器中触发事件 – 您调用该方法,并使该方法调用该事件。 任何覆盖该方法的人都应调用base.OnSelectedChanged
以确保该事件仍然触发。 所以你的方法应该是这样的:
protected virtual void OnSelectedChanged(EventArgs e) { EventHandler handler = Selected; // Or your own delegate variable if (handler != null) { handler(this, e); } }