黑马程序员技术交流社区

标题: 事件参数列表中的 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对象,来代表谁调用的,第二个参数传的是“我们需要用到的参数”
  1. public delegate void UserLoginDelegate(object sender, UserLoginEventArgs e);
复制代码
object sender
  {
           为什么定义这两个参数:
                      1.object类是所有类的基类,也就是说,我可以在知道自己传的是个什么的时候,显式的转换成要操作的类<挺绕的,下文详细说明>
                      2.这是微软提倡的规范,没办法,人家是老大~{:soso_e127:}
  }


UserLoginEventArgs e
  1. public UserLoginEventArgs(string uid, string pwd):EventArgs
  2.         {
  3.             this.UserId = uid;
  4.             this.UserPassword = pwd;
  5.             this.IsOK = false;
  6.         }
复制代码
这个是自己定义的类,用于保存要传的参数值,(其实我建议还是从 EventArgs 派生好,符合规范嘛)
这样 上面那个委托传的 UserLoginEventArgs e ,就可以用e.UserId取值啦~~

第二步:定义一个事件,其实事件也就是个委托而已
  1. public event UserLoginDelegate UserLogin;
复制代码
这样,我们就可以往事件中添加要处理的方法啦~~~ 然后别忘记,要在需要的时候,调用这个委托!!!

第三步,看看这个按钮的点击事件:
  1. //登录按钮的单击事件
  2.         private void button1_Click(object sender, EventArgs e)
  3.         {
  4.             string uid = txtUid.Text.Trim();  //过滤掉前后的空格
  5.             string pwd = txtPwd.Text.Trim(); //过滤掉前后的空格

  6.             //第三步,根据需求在适当的时候触发事件:登录成功与不成功时,窗口的不同显示,用来直观感受
  7.             UserLoginEventArgs evt = new UserLoginEventArgs(uid, pwd);    //利用构造函数,new一个刚才自己写的类,用来传参数用。
  8.             if (this.UserLogin != null) //判断一下,委托不为空的话,再调用
  9.             {
  10.                 UserLogin(this, evt);  //调用委托,注意看传的参数!!!!!
  11.             }
  12.             if (evt.IsOK)
  13.             {
  14.                 this.BackColor = Color.Green;
  15.             }
  16.             else
  17.             {
  18.                 this.BackColor = Color.Red;
  19.             }
复制代码
然后,就是+=,调用啦:
  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             //为用户控件注册一个“登录”事件
  4.             this.ucLogin1.UserLogin += new UserLoginDelegate(ucLogin1_UserLogin);
  5.         }

  6.         //当用户登录时,触发,执行该代码
  7.         void ucLogin1_UserLogin(object sender, UserLoginEventArgs e)
  8.         {
  9.             if (e.UserId == "admin" && e.UserPassword == "888")
  10.             {
  11.                 e.IsOK = true;
  12.             }
  13.         }
复制代码
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Ps:
   很多事件都是(object sender, EventArgs e)这个样子,第一个参数,代表是哪个对象传的,第二个参数,是要使用的附加参数(可以从EventArgs派生一个类,因为EventArgs里没有成员可以添加我们想要用的参数信息
   假设现有这么两个类:
  1. public class People
  2. {
  3.     public name="Jim";
  4. }
复制代码
  1. public UserEventArgs():EventArgs
  2. {
  3.     public string Message;
  4.     public UserEventArgs(string str){Message=str;}
  5. }
复制代码
定义一个事件:
  1. private delegate void UserLoginDelegate(object sender, UserEventArgs e);
  2. public event UserLoginDelegate Myevent;
复制代码
再写一个方法:
  1. public void CallEvent (object sender, UserEventArgs e);
  2. {
  3.     People p1=(People)sender;
  4.     Console.WriteLine("{0} Say: {1}",p1.name,e.Message);
  5. }
复制代码
这样,我调用这个委托,把People的对象传进去,然后再强制转换一下(因为我知道,我传的就是People类型),就可以访问People的对象啦~~
  1. People peopleA=new People();
  2. Myevent+=CallEvent;
  3. Myevent(peopleA,new UserEventArgs("Hello world."));
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2