gpt4 book ai didi

c# - 未在用户控件中调用覆盖事件

转载 作者:行者123 更新时间:2023-11-30 15:52:25 26 4
gpt4 key购买 nike

我有一个带有 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 事件设置委托(delegate)时,它为 UserControl 本身设置委托(delegate)并且不会被覆盖,以便 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);
}

示例 - 手动引发 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

关于c# - 未在用户控件中调用覆盖事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com