编写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;}}
附加:
解耦:解除耦合。两边都是“糊涂”。