委托和事件
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 }
这里定义了一个控件的事件
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 }
下面就是调用用户控件
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 }
用户控件 调用的时候 参数怎么设置成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; } }
调用
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; }