委托和事件

1.委托是一种数据类型,就和int 一样,事件是对象

事件只能+= -= 不能直接=赋值,这样保证了事件的安全,事件内部是用委托来实现的,通过私有委托,和共有方法,来实现+= -=

事件和委托在用户控件中使用的比较多

2.下面是一个用户登录控件

 模仿 private void button1_Click(object sender, EventArgs e)中的EventArgs

    在c#中一般会通过类似EventArgs的形式,来传递一些数据

  比如DataGridView中的 DataGridViewCellEventArgs e

    可获得 e.ColumnIndex  和 e.RowIndex

这里写了一个UserLoginEventArgs来传递登录的一些信息

 1   /// <summary>
 2     /// 包含用户登录控件的事件数据的类
 3     /// </summary>
 4     public class UserLoginEventArgs : EventArgs
 5     {
 6         public string LoginId
 7         {
 8             get;
 9             set;
10         }
11         public string LoginPassword
12         {
13             get;
14             set;
15         }
16         /// <summary>
17         /// 是否登录成功
18         /// </summary>
19         public bool IsOk
20         {
21             get;
22             set;
23         }
24 
25     }
View Code

这里定义了一个控件的事件

 1   /// <summary>
 2         /// 定义了一个用户校验事件
 3         /// </summary>
 4         public event Action<object, UserLoginEventArgs> UserLoginValidating;
 5 
 6         private void button1_Click(object sender, EventArgs e)
 7         {
 8             //在这里执行用户的校验
 9             if (UserLoginValidating != null)
10             {
11                 UserLoginEventArgs userLoginArgs = new UserLoginEventArgs();
12                 //给用户控件赋值
13                 userLoginArgs.IsOk = false;
14                 userLoginArgs.LoginId = txtUid.Text.Trim();
15                 userLoginArgs.LoginPassword = txtPwd.Text.Trim();
16                 //验证 this 是用户控件, userLoginArgs里面包含了数据
17                 //因为在引用控件的地方是访问不到控件里面的txtUid的值的
18                 //所以我们要通过UserLoginEventArgs把数据传过去,好在那里做判断 登录是否成功
19                 //来给isok赋值
20                 UserLoginValidating(this, userLoginArgs);
21 
22                 if (userLoginArgs.IsOk)
23                 {
24                     //通过验证
25                 }
26                 else
27                 {
28                     //没用通过验证
29                 }
30             }
31 
32         }
View Code

下面就是调用用户控件

  

 1  private void Form1_Load(object sender, EventArgs e)
 2         {
 3             //注册事件
 4             ucLogin1.UserLoginValidating += new Action<object, UserLoginEventArgs>(ucLogin1_UserLoginValidating);
 5         }
 6 
 7         /// <summary>
 8         /// 验证登录信息
 9         /// </summary>
10         /// <param name="arg1">这里是控件</param>
11         /// <param name="arg2">控件的一些数据</param>
12         void ucLogin1_UserLoginValidating(object arg1, UserLoginEventArgs arg2)
13         {
14             //验证
15             if (arg2.LoginId == "admin" && arg2.LoginPassword == "111")
16             {
17                 arg2.IsOk = true;//isok默认是false
18             }
19         }
View Code

 用户控件 调用的时候 参数怎么设置成sender e

 public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        //这样生成的事件参数就会是 sender 和 e 了
        public delegate void LoginDel<in T1, in T2>(T1 sender, T2 e);
        public event LoginDel<object, LoginEventArgs> ValidateingTwo;
        //Action 定义的事件生成的参数是 arg1 arg2
        public event Action<object, LoginEventArgs>  Validating;
        private void button1_Click(object sender, EventArgs e)
        {
            bool ischeck = checkBox1.Checked;
            string name = textBox1.Text.Trim();
            LoginEventArgs l=new LoginEventArgs ();
            l.IsCheck=ischeck;
            l.Name=name;
            //这个事件的参数是arg1 arg2
            Validating(this,l);
            
            //这个事件的参数是sender e
            ValidateingTwo(this,l);
            if (l.isOk)
            {//
                
            }

        }
    }
    public class LoginEventArgs:EventArgs
    {
        public string Name { get; set; }
        public bool IsCheck { get; set; }
        public bool isOk { get; set; }
    }
View Code

调用

 private void Form1_Load(object sender, EventArgs e)
        {
            userControl11.Validating += userControl11_Validating;

            userControl11.ValidateingTwo += userControl11_ValidateingTwo;
        }

        void userControl11_ValidateingTwo(object sender, LoginEventArgs e)
        {
            bool ischeck = e.IsCheck;
            string name = e.Name;
        }

        void userControl11_Validating(object arg1, LoginEventArgs arg2)
        {
           string name= arg2.Name;
           bool ischeck = arg2.IsCheck;
        }
View Code
原文地址:https://www.cnblogs.com/nanxiaoxiang/p/6559845.html