小例子复习下委托的应用

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

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));
}

 

 

 

 

posted @ 2010-09-10 10:44  lianghugg  阅读(306)  评论(3编辑  收藏  举报