本文主要是介绍由委托说明事件的由来1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们现在想在winform中添加两个窗体,每一个窗体上都添加同一个用户控件,用户控件上有一个button,点击按钮三次会提示内容。
我们想如果form1点击会提示:您点击了三次Form1按钮!
如果form2点击会提示:您点击了三次Form2按钮!
如果我们在用户控件的button的事件中写会提示相同的内容,所以我们应该使用委托来写。
1、在用户控件的代码中声明一个委托(类型);在form窗体中规定他要指向的方法;这个方法提示内容。
用户控件中的代码:
namespace WindowsFormsApplication2
{public delegate void TishiDelegate();public partial class UserControl1 : UserControl{public TishiDelegate tishi;public UserControl1(){InitializeComponent();}int count = 0;private void button1_Click(object sender, EventArgs e){count++;//MessageBox.Show("这是form1");if (tishi!=null&&count==3){tishi();count = 0;}}}
}
在form窗体加载的事件中为委托指向方法;代码如下:
private void Form1_Load(object sender, EventArgs e)
{
this.userControl11.tishi = TishiForm;
}
private void TishiForm()
{
MessageBox.Show("您点击了三次Form1按钮!");
}
form2窗体的代码与form1窗体的代码相同。
虽然上述方法已经实现所需要的功能,不过还是有不足之处:
1、如果我们在form窗体添加一个button控件,这个控件的点击事件代码如下:
private void button1_Click(object sender, EventArgs e)
{
this.userControl11.tishi();
}
运行的结果是弹出提示框,而我们想点击三次用户控件的button才弹出提示框,所以这是一个不足。不需要操作用户控件,就可以直接调用委托,这是不安全的。
2、如果在form的加载事件中,为委托添加委托链:
private void Form1_Load(object sender, EventArgs e)
{
this.userControl11.tishi = TishiForm;
this.userControl11.tishi += TishiForm1;
this.userControl11.tishi += TishiForm2;
}
private void TishiForm()
{
MessageBox.Show("您点击了三次Form1按钮!");
}
private void TishiForm1()
{
MessageBox.Show("您点击了三次Form1按钮11111!");
}
private void TishiForm2()
{
MessageBox.Show("您点击了三次Form1按钮22222!");
}
当点击用户控件的button时会提示每个方法中的内容。
而如果在form窗体添加一个button控件,这个控件的点击事件代码如下:
private void button1_Click(object sender, EventArgs e)
{
this.userControl11.tishi = TishiForm2;
}
再次点击用户控件中的按钮时,只会提示第三个方法中的内容。在外部可以改变委托指向的方法,把以前的方法给覆盖了,这样是安全隐患,
这也是不足。
解决方法见由委托说明事件的由来2。
这篇关于由委托说明事件的由来1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!