小例子复习下委托的应用
群里一同学问了个问题,描述如下:
void Method()
{
string name = "hello"; //需要在 Button.OnClick里使用
int age = 10;
if(Button.PerformClick()) //伪代码
{
//do something
}
}
void Button.OnClick() //伪代码
{
//此处要使用Method里的name,age
}
{
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 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();
}
}
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));
}
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));
}