其他分享
首页 > 其他分享> > 覆盖事件未在用户控件中调用

覆盖事件未在用户控件中调用

作者:互联网

我有一个带有文本框的用户控件:

public partial class MyControl : UserControl
{
    public new event CancelEventHandler Validating
    {
        add
        {
            txt.Validating += value;
        }
        remove
        {
            txt.Validating -= value;
        }
    }

    public new string Text
    {
        get => txt.Text;
        set => txt.Text = value;
    }
}

我将控件和ErrorProvider放在窗体上,然后执行以下操作:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void onl oad(EventArgs e)
    {
        base.OnLoad(e);

        SetErrorEvents(myControl1);
    }

    private void SetErrorEvents(object control)
    {
        (control as Control).Validating += ValidationEvent;
    }

    private void ValidationEvent(object sender, CancelEventArgs e)
    {
        var control = (Control)sender;

        if (string.IsNullOrWhiteSpace(control.Text))
            errorProvider1.SetError(control, "error");
        else
            errorProvider1.SetError(control, string.Empty);
    }
}

在为my控件的Validating事件设置委托时,它是为UserControl本身设置委托,并且不会被覆盖,因此将设置TextBox的事件.

上述工作不应该按原样进行吗?我想念什么?

解决方法:

它不会被覆盖,它已被new关键字遮盖或隐藏.您尚未订阅新事件,您已经订阅了基类事件.基本上就是polymorphism的工作方式.

>如果要在验证子控件时引发用户控件的Validating事件,请处理子控件的Validating事件并调用用户控件的OnValidating方法.
>如果要覆盖Validating事件,请重写OnValidating方法.
>如果要更改Validating事件的发送者,则需要更改Validating事件的调用方式.为此,您需要使用反射并找到事件,然后直接自己调用它.

示例-在验证子控件时引发UserControl的验证事件

如果您想在验证子文本框时引发控件的Validating事件,请处理子控件的Validating事件并调用“

public MyControl()
{
    InitializeComponent();
    txt.Validating += (obj, args) => OnValidating(args);
}

示例-覆盖验证事件

protected override void OnValidating(CancelEventArgs e)
{       
    // Add custom code here.       
    base.OnValidating(e);
}

示例-在不调用base.OnValidating的情况下手动引发Validating事件

如果由于某种原因您不想调用base.OnValidating,而它的责任基本上是引发Validating事件,则可以找到该事件并直接调用它:

protected override void OnValidating(CancelEventArgs e)
{  
    var f = typeof(Control).GetField("EventValidating",
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Static);
    var validating = (CancelEventHandler)Events[f.GetValue(this)];
    validating?.Invoke(this, e); 
}

这样,例如,您可以设置另一个发件人(例如子控件)来代替.

标签:user-controls,events,c,net,winforms
来源: https://codeday.me/bug/20191108/2006630.html