簡體   English   中英

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

[英]How to override method and event in WinForm UserControl in C#?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM