How to override method and event in WinForm UserControl in C#?
I have a custom control in C# WinForms called BaseControl
and there I have a property called Selected
.
I want to have an event SelectedChanged
and virtual method OnSelecteChanged
in the base control and they should behave in the same manner as we have in Control
class for many properties i.e. Click
event and OnClick
method.
Means anyone who derives from my BaseControl
can either bind to the event or can override the OnSelectedChanged
method.
So, when the value of Selected
property is changed event should be fired and if the method is overridden control s开发者_StackOverflow社区hould go to that method.
I know how to fire the event but don't know how to do it for method.
Please guide me...
Below is an example of how events should be implemented:
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);
}
}
With this example, you can override OnSelectedChanged
in an overriden class, like this:
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);
}
Basically you don't fire the event from your Selected
property setter - you call the method, and make the method call the event. Anyone overriding the method should call base.OnSelectedChanged
to make sure the event still fires. So your method should look something like this:
protected virtual void OnSelectedChanged(EventArgs e) {
EventHandler handler = Selected; // Or your own delegate variable
if (handler != null) {
handler(this, e);
}
}
精彩评论