我上有一个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
的情况下,将被设置。
应该不是上述工作的是什么?我在想什么?
它不重写,它已经被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
。
定义这个接口:
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;
}
...