如何在C#中覆盖WinForm UserControl中的方法和事件?

时间:2010-11-16 13:47:34

标签: c#

我在C#WinForms中有一个名为BaseControl的自定义控件,我有一个名为Selected的属性。

我希望在基本控件中有一个事件SelectedChanged和虚方法OnSelecteChanged,它们的行为应该与Control类中的许多属性相同,即{{{ 1}}事件和Click方法。

意味着从我的OnClick派生的任何人都可以绑定到该事件或者可以覆盖BaseControl方法。

因此,当OnSelectedChanged属性的值被更改时,应该触发事件,如果方法被覆盖,则控制应该转到该方法。

我知道如何解雇这个事件,但不知道该怎么做方法。

请指导我......

3 个答案:

答案 0 :(得分:3)

以下是如何实施事件的示例:

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.
    }
}

答案 1 :(得分:1)

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);
}

答案 2 :(得分:0)

基本上,您不会从Selected属性设置器中触发事件 - 您调用该方法,并使该方法调用该事件。任何覆盖该方法的人都应该调用base.OnSelectedChanged以确保该事件仍然会触发。所以你的方法应该是这样的:

protected virtual void OnSelectedChanged(EventArgs e) {
    EventHandler handler = Selected; // Or your own delegate variable
    if (handler != null) {
        handler(this, e);
    }
}