您的位置:首页 > 其它

由委托说明事件的由来1

2014-04-03 15:40 417 查看
委托的一些应用:
多线程
自定义类(用户控件、通信类……(事件))
窗体之间回传值
正则表达式中替换Email掩码Replace()

我们现在想在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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: