首先要知道,委托是一种数据类型,委托的概念就是事件的引用,事件就是依靠委托创建的一种有有限制的委托变量,他是为了解决委托在一些情况下的问题而出现的。。
用例子来看:
在Form1类里
private void Form1_Load(object sender, EventArgs e)
{
ucButton1.tripleClick = TripleClick;
ucButton1.tripleClick = TripleClick3;
ucButton1.tripleClick = TripleClick2;
}
private void TripleClick()
{
MessageBox.Show("再在我在Form1中,执行三连击事件!");
}
private void TripleClick2()
{
MessageBox.Show("222222222222222222222222222!");
}
private void TripleClick3()
{
MessageBox.Show("3333333333333333333333333333!");
}
private void button1_Click(object sender, EventArgs e)
{
//通过委托来实现事件的功能的问题有:
// 1,可以在类的内部来触发,也可以在类的外部触发。因为委托变量必须是是public类型的。
//2 委托变量的赋值方式可以使用=,这样就有可能把之前的委托指向覆盖。
//ucButton1.tripleClick();
}
private void button2_Click(object sender, EventArgs e)
{
//2 委托变量的赋值方式可以使用=,这样就有可能把之前的委托指向覆盖。
ucButton1.tripleClick = TripleClick2;
// ucButton1.tripleClick();
}
在自定义控件 UCButton中 :
public delegate void TripleClickDelegate();
public partial class UCButton : UserControl
{
public TripleClickDelegate tripleClick;
//如果把tripleClick设置为private,那么的确在外部不能触发了,但是也不能在外部赋值了。
public UCButton()
{
InitializeComponent();
}
int count = 0;
private void btnTriple_Click(object sender, EventArgs e)
{
count++;
if (count >= 3)
{
if (tripleClick != null)
{
//当用户三连击后触发指定的方法
tripleClick();
}
count = 0;
}
}
而如果使用事件来写的话这两个问题就可以解决
首先事件不能使用=赋值只能在-=或+=左边 其次 事件只能在内部调用在外面只能赋值。。。
Form1类:
private void Form2_Load(object sender, EventArgs e)
{
ucTtripleClickEvent1.tripleClick += new MyTripleClick(Click2);
ucTtripleClickEvent1.tripleClick+= Click1;
}
void Click1()
{
MessageBox.Show("通过事件实现三连击!");
}
void Click2()
{
MessageBox.Show("22222三连击!");
}
三连击控件类:
public delegate void MyTripleClick();
public partial class UCTtripleClickEvent : UserControl
{
public UCTtripleClickEvent()
{
InitializeComponent();
}
//有了委托类型以后就可以定义事件了
public event MyTripleClick tripleClick;
int count = 0;
private void button1_Click(object sender, EventArgs e)
{
count++;
if (count >= 3)
{
//用事件来实现,用之前要定义事件类型,要定义事件必须有委托,否则无法使用。
tripleClick();
count = 0;
}
}
}