zoukankan      html  css  js  c++  java
  • 委托和事件

    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
  • 相关阅读:
    PyQt(Python+Qt)学习随笔:containers容器类部件QStackedWidget重要方法介绍
    什么叫工业4.0,这篇接地气的文章终于讲懂了
    怎样 真正认识一个 人
    华为的绩效管理:减人、增 效、加薪
    羽毛球战术
    魔方教程
    员工培养:事前指导,事后纠正
    一把手瞄准哪里,核心竞争力就在哪里
    海尔的五次战略变革
    如何提高基层员工的执行力
  • 原文地址:https://www.cnblogs.com/nanxiaoxiang/p/6559845.html
Copyright © 2011-2022 走看看