zoukankan      html  css  js  c++  java
  • 小例子复习下委托的应用

    群里一同学问了个问题,描述如下:

    void Method()
            {
                
    string name = "hello";  //需要在 Button.OnClick里使用
                int age = 10;
                
    if(Button.PerformClick())  //伪代码
                {
                   
    //do  something
                }
            }
            
    void Button.OnClick()  //伪代码
            {
                
    //此处要使用Method里的name,age
            }

    这段代码是为了描述问题写的模拟伪代码, 问题是不使用全局变量 name 和 age的时候,要将  name age传递到按钮的 OnClick事件函数里, 

    其实处理这个问题。首先想到的就是 委托,想到委托就会想到委托的参数,所以这里必须自己定义个参数类,来包含 name 和 age参数

     先来定义个委托参数类

     public class XEventArgs : EventArgs
        {
            
    public XEventArgs(string name,int age)
            {
                Name 
    = name;
                Age 
    = age;
                Another 
    = new List<string>();
            }
            
    public string Name;
            
    public int Age;
            
    public List<string> Another;
        }

    有个委托参数,接着定义委托 

    public delegate void EventHandler<XEventArgs>(XButton sender,XEventArgs e);

    委托定义里第一个参数是 Xbutton类型,这哪里来的呢,这里就要想到了,有了委托还不行,如何要使用这个委托,又如何将委托参数传递给Button的OnCLick事件函数呢

    这里就需要自定义Button控件了,完整代码如下

    public delegate void EventHandler<XEventArgs>(XButton sender,XEventArgs e);
        
    public class XEventArgs : EventArgs
        {
            
    public XEventArgs(string name,int age)
            {
                Name 
    = name;
                Age 
    = age;
                Another 
    = new List<string>();
            }
            
    public string Name;
            
    public int Age;
            
    public List<string> Another;
        }
        
    public class XButton:Button
        {
            
    public XButton()
            { 
              
    //...
            }
            
    public event EventHandler<XEventArgs> XOnClick;
            
    public virtual void PerformClick(XEventArgs e)
            {
                
    if (XOnClick!=null)
                    XOnClick(
    this, e);

                
    base.PerformClick();
            }
        }

     通过上述代码可以发现,自定义的Xbutton控件 提供了一个接口 void PerformClick(XEventArgs e),

    同时定义了一个自定义事件  event EventHandler<XEventArgs> XOnClick;

    到这里应该就比较清楚了, 我们的窗体中应该用 XButton  来替代Button ,然后绑定它的 XOnClick事件

    在原来问题的 Method() 函数中 执行 XButton的 PerformClick(XEventArgs) 函数,

    测试代码如下:

    代码
     XButton xbtn;
            
    public Form1()
            {
                InitializeComponent();
                xbtn 
    = new XButton();
                
    //关键点
                xbtn.XOnClick += new EventHandler<XEventArgs>((sender, e) =>
                {
                    MessageBox.Show(
    string.Format("Name={0},Age={1}", e.Name, e.Age));
                });
    }

    void Method()
    {
         
    string name = "hello";
         
    int age = 10;
         
    //关键点       
         xbtn.PerformClick(new XEventArgs(name,age));
    }
  • 相关阅读:
    mysql----show slave status G 说明
    mysqldump 的方式来搭建master-->slave 的复制架构
    C++----练习--string 从文件中一个一个单词的读直到文件尾
    python 全排列combinations和permutations函数
    什么是restful api
    git知识点
    Hash算法解决冲突的方法
    python之单例设计模式
    Linux常用命令大全
    SQLAlchemy中时间格式化及将时间戳转成对应时间的方法-mysql
  • 原文地址:https://www.cnblogs.com/cxwx/p/1823034.html
Copyright © 2011-2022 走看看