不会被调用在用户控件重写事件

问题描述 投票:3回答:2

我上有一个TextBox一个用户控件:

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

当设置为我控制的Validating事件的代表,它的设置委托的UserControl本身并没有被重写,以使TextBox的情况下,将被设置。

应该不是上述工作的是什么?我在想什么?

c# .net winforms events user-controls
2个回答
2
投票

它不重写,它已经被new关键字阴影或隐藏。您没有申请到新的事件,你已经认购的基类事件。它基本上polymorphism是如何工作的。

  • 如果你想提高时,子控件验证用户控制的Validating事件,处理子控件的Validating事件并调用OnValidating用户控件的方法。
  • 如果你想覆盖Validating事件覆盖OnValidating方法。
  • 如果你想改变Validating事件的发件人,您需要更改Validating事件已被调用的方式。要做到这一点,你需要使用反射和发现事件与自己直接调用它。

例如 - 提高验证用户控件的事件时,子控件正在验证

如果你想提高你的控制Validating事件,当孩子文本框验证,处理子控件的Validating事件并调用``

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

示例 - 覆盖验证事件

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

实施例 - 手动提高Validating事件而不调用base.OnValidating

如果由于某种原因,你不想叫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); 
}

这样做,比如你可以设置其他发件人像孩子的控制,而不是this


1
投票

定义这个接口:

public interface IMyControl
{
    event CancelEventHandler Validating;
}

接口适用于您的自定义控制:

public partial class MyControl : UserControl, IMyControl
{
    ...
}

在你Form类,更新SetErrorEvents()所以它转换而不是IMyControl

...
private void SetErrorEvents(object control)
{
    (control as IMyControl).Validating += ValidationEvent;
}
...
© www.soinside.com 2019 - 2024. All rights reserved.