黑马程序员技术交流社区
标题:
事件参数列表中的 object sender具体是干什么的,有什么作用?
[打印本页]
作者:
赵威
时间:
2013-4-24 16:17
标题:
事件参数列表中的 object sender具体是干什么的,有什么作用?
本帖最后由 赵威 于 2013-4-29 09:11 编辑
namespace _07自己定义一个登录控件
{
//第一步,定义一个用来实现事件的委托
public delegate void UserLoginDelegate(object sender, UserLoginEventArgs e);
public partial class ucLogin : UserControl
{
public ucLogin()
{
InitializeComponent();
}
//第二步,根据定义好的委托,在要使用事件的类中定义事件变量
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);
if (this.UserLogin != null)
{
UserLogin(this, evt);
}
if (evt.IsOK)
{
this.BackColor = Color.Green;
}
else
{
this.BackColor = Color.Red;
}
}
}
public class UserLoginEventArgs
{
public UserLoginEventArgs(string uid, string pwd)
{
this.UserId = uid;
this.UserPassword = pwd;
this.IsOK = false;
}
//定义用户名属性UserId
public string UserId
{
get;
set;
}
//定义用户登录密码属性UserPassWord属性
public string UserPassword
{
get;
set;
}
//用来判断登录成功与否
public bool IsOK
{
get;
set;
}
}
}
file:///C:/Users/Administrator/AppData/Local/youdao/ynote/images/5A7BB817F64B41638B60F6530E5852EA/7C47CC69ECBB4E939916085A70C1950E.jpg
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;
}
}
上面的参数列表中的object sender具体是干什么用的,感觉去掉与否都不影响程序的正常执行,那它有什么作用????
作者:
许庭洲
时间:
2013-4-24 21:33
object sender就是被触发的对象,就是button控件,radio控件等一类的对象的获取
作者:
贡宗新
时间:
2013-4-24 23:17
Net Framework中的事件必要的两个参数,object sender 指的是事件监视的对象, EventArgs 就是事件所需要的数据。
例如:
private void label1_MouseClick(object sender, MouseEventArgs e)
{
Label senderLabel = (Label)sender;//根据sender引用控件。
senderLabel.Text = e.Button.ToString();//根据e中的Button参数,判断是左键还是右键。
}
然后在窗体中单击你的Label,就会显示你单击的鼠标的按键right或者Left。
——————————————————
以Button为例:
protected void Button1_Click(object sender, EventArgs e)
其中的sender,就是你点击的button.可以通过类型转换得到这个button的引用:
Button sendButton = (Button)sender;
e是你点击事件的一些参数。
作者:
崔宏奎
时间:
2013-4-25 00:08
第一步:看这个委托定义,第一个参数传了一个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."));
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2