第一步:看这个委托定义,第一个参数传了一个object对象,来代表谁调用的,第二个参数传的是“我们需要用到的参数”- public delegate void UserLoginDelegate(object sender, UserLoginEventArgs e);
复制代码 object sender:
{
为什么定义这两个参数:
1.object类是所有类的基类,也就是说,我可以在知道自己传的是个什么的时候,显式的转换成要操作的类<挺绕的,下文详细说明>
2.这是微软提倡的规范,没办法,人家是老大~{:soso_e127:}
}
UserLoginEventArgs e:- public UserLoginEventArgs(string uid, string pwd):EventArgs
- {
- this.UserId = uid;
- this.UserPassword = pwd;
- this.IsOK = false;
- }
复制代码 这个是自己定义的类,用于保存要传的参数值,(其实我建议还是从 EventArgs 派生好,符合规范嘛)
这样 上面那个委托传的 UserLoginEventArgs e ,就可以用e.UserId取值啦~~
第二步:定义一个事件,其实事件也就是个委托而已- public event UserLoginDelegate UserLogin;
复制代码 这样,我们就可以往事件中添加要处理的方法啦~~~ 然后别忘记,要在需要的时候,调用这个委托!!!
第三步,看看这个按钮的点击事件:- //登录按钮的单击事件
- private void button1_Click(object sender, EventArgs e)
- {
- string uid = txtUid.Text.Trim(); //过滤掉前后的空格
- string pwd = txtPwd.Text.Trim(); //过滤掉前后的空格
- //第三步,根据需求在适当的时候触发事件:登录成功与不成功时,窗口的不同显示,用来直观感受
- UserLoginEventArgs evt = new UserLoginEventArgs(uid, pwd); //利用构造函数,new一个刚才自己写的类,用来传参数用。
- if (this.UserLogin != null) //判断一下,委托不为空的话,再调用
- {
- UserLogin(this, evt); //调用委托,注意看传的参数!!!!!
- }
- if (evt.IsOK)
- {
- this.BackColor = Color.Green;
- }
- else
- {
- this.BackColor = Color.Red;
- }
复制代码 然后,就是+=,调用啦:- private void Form1_Load(object sender, EventArgs e)
- {
- //为用户控件注册一个“登录”事件
- this.ucLogin1.UserLogin += new UserLoginDelegate(ucLogin1_UserLogin);
- }
- //当用户登录时,触发,执行该代码
- void ucLogin1_UserLogin(object sender, UserLoginEventArgs e)
- {
- if (e.UserId == "admin" && e.UserPassword == "888")
- {
- e.IsOK = true;
- }
- }
复制代码 --------------------------------------------------------------------------------------------------------------------------------------------------------------
Ps:
很多事件都是(object sender, EventArgs e)这个样子,第一个参数,代表是哪个对象传的,第二个参数,是要使用的附加参数(可以从EventArgs派生一个类,因为EventArgs里没有成员可以添加我们想要用的参数信息)
假设现有这么两个类:- public class People
- {
- public name="Jim";
- }
复制代码- public UserEventArgs():EventArgs
- {
- public string Message;
- public UserEventArgs(string str){Message=str;}
- }
复制代码 定义一个事件:- private delegate void UserLoginDelegate(object sender, UserEventArgs e);
- public event UserLoginDelegate Myevent;
复制代码 再写一个方法:- public void CallEvent (object sender, UserEventArgs e);
- {
- People p1=(People)sender;
- Console.WriteLine("{0} Say: {1}",p1.name,e.Message);
- }
复制代码 这样,我调用这个委托,把People的对象传进去,然后再强制转换一下(因为我知道,我传的就是People类型),就可以访问People的对象啦~~- People peopleA=new People();
- Myevent+=CallEvent;
- Myevent(peopleA,new UserEventArgs("Hello world."));
复制代码 |