编写UserControl,UserControl内有一个textbox,需要对textbox中的值进行验证。将验证时机、验证报错等写在UserControl中,把数据的不同的校验逻辑通过Delegate动态指定。
public Validate Validator;
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (Validator(textBox1.Text) == false)
{
MessageBox.Show("数据非法");
}
}
public delegate bool Validate(string txt);
设置不同的Validator即可。
修改校验的报错方式。userControl11是别人写的控件,使用者不用关心什么时候校验,校验出错的时候怎么报错,只要关心对数据进行校验就可以了,使用控件的人不用懂WinForm控件的开发。
控件使用者:不用关心控件在什么时候进行数据校验、校验出错怎么报错,只要指定校验算法就可以。
控件开发者:不用把校验算法写死在控件里。
委托代码:
public partial class ValidationTextBox : UserControl
{
public ValidationDelegate OnValidation;
public ValidationTextBox()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (OnValidation != null)
{
ValidationEventArgs args = new ValidationEventArgs();
args.Value = textBox1.Text;
args.IsValid = true;//是否合法
OnValidation(args);
if (args.IsValid == false)
{
MessageBox.Show("数据错误!");
}
}
}
}
public delegate void ValidationDelegate(ValidationEventArgs e); //定义一个委托
public class ValidationEventArgs //定义一个函数
{
public string Value { get; set; }
public bool IsValid { get; set; }
}
调用:
public Form1()
{
InitializeComponent();
txtUsername.OnValidation = UserName_Validation;
}
void UserName_Validation(ValidationEventArgs e)
{
if (e.Value.Length <= 2)
{
e.IsValid = false;
}
}
附加:
解耦:解除耦合。两边都是“糊涂”。