当前位置: 代码迷 >> 综合 >> 委托和事件(7)——委托使用案例:数据验证控件
  详细解决方案

委托和事件(7)——委托使用案例:数据验证控件

热度:57   发布时间:2023-10-01 22:19:03.0

编写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;}}

附加:

解耦:解除耦合。两边都是“糊涂”。

  相关解决方案