如何在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); } }