什么是事件?
事件(通过委托实现的,委托才是事件能正常执行的核心内容)
事件的作用:
事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或 -= 来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)
事件语法:public event Mydel _mdl;
1、添加WebForm窗体
2、自己定义一个控件(项目右键,添加,用户控件,托Button控件进来)
3、声明变量i=0;
4、点击按钮“三连击”写代码,记得i==3的时候要清0;
5、F6启动生成!
6、回到窗体Form1.拖进来userClick控件,生成项目!
总结:这样不好,方法写死,点击事件的方法写死。我想要点击这个按钮还可以用于其他的功能,,用委托实现!!!
7.改进:
8、在userClick这个类中,定义委托 MyDel...在单击事件这个方法上写上委托字段,接收方法变量。
9、写完毕,点击F6,启动生成!
10、运行,此时,发现,点击”三连击“按钮,没有了任何的反应,因为委托中的方法是空的;;
11、双击Form1进入窗体加载的事件,,对委托中进行赋值方法,调用方法(写你想要的方法)
12、写方法;
13、下面接着添加一个普通的按钮,
private void button1_Click(object sender, EventArgs e)
{
userClick1._mdl();//此时,发现,使用不是很安全,因为可以被其他的点击事件直接调用
}
Form1代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 三连击
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//userClick1._mdl = Show; //窗体加载的时候。我要给这个按钮做什么。我就给它赋值一个方法名字就行了
userClick1._mdl = Do;
}
public void Show()
{
MessageBox.Show("不错,就是这样!");
}
public void Do()
{
MessageBox.Show("人性!");
}
private void button1_Click(object sender, EventArgs e)
{
userClick1._mdl();//此时,发现点击这个按钮一次就可以出发三连接的效果,
//使用不是很安全,因为可以被其他的点击事件直接调用
//下面用事件,就可以避免这种情况的发生1
}
}
}
userClick 代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 三连击
{
public delegate void MyDel();
public partial class userClick : UserControl
{
public userClick()
{
InitializeComponent();
}
int i = 0;
public MyDel _mdl;//定义一个委托字段
private void button1_Click(object sender, EventArgs e)
{
i++;
if (i==3)
{
i = 0;// 清零
//MessageBox.Show("三连击");
if (this._mdl!=null)
{
_mdl();//委托不为空,就将委托字段_mdl,拿进来!!
}
}
}
}
}
总结:你辛苦的创建了一个委托进行事件的调用,可是,却被其他的,事件也可轻易地调用,不是想要的结果,。。可以这么说:你定义了一个报警器,当你吸烟的时候,就会警告。其他的事情发生就不会发出警告的。。可是,有一天,别人在你家外边敲了一下你的门子,你的警报器也响了。是不是感觉,这个警报器,失灵了呢。。。所以,就要对这个警报器,进行修改了!
14、下面用事件,就可以避免这种情况的发生1
事件!概念!!
新建项目 ---->>事件三连击
15、步骤和三连接是一样的,在委托字段前加上关键字event
唯一不同的是,在这里添加了 关键字 event ,就变成了事件
16、这里可以尝试着,写上DoSth()方法,发现是不行的。因为事件只能使用 ”+=“来赋值。。”-=“来移除事件,而没有 “ = ”这样的使用方法,所以这样就避免了,被赋值的现象!!!
Form 1代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 事件三连击
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//窗体加载的时候,给按钮注册事件!
//userClick1._mdl = DoSth(); //假设有DoSth()这个方法
userClick1._mdl += userClick1__mdl;
}
void userClick1__mdl()
{
//throw new NotImplementedException();
MessageBox.Show("+=后按下Tab键,就可以自动弹出方法了");
}
private void button1_Click(object sender, EventArgs e)
{
//userClick1._mdl(); //发现这里是不能调用的 ”=“不起作用
}
//public void DoSth()
//{
// MessageBox.Show("这就是事件!!");
// }
//F6有错误!说明事件没有 = 号这个用法,只有 += —=这样的用法,所以就避免了,被赋值的事情的发生
}
}
userClick 代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 事件三连击
{
public delegate void MyDel();
public partial class UserClick : UserControl
{
public UserClick()
{
InitializeComponent();
}
int i = 0;
public event MyDel _mdl;//唯一不同的是,在这里添加了 关键字 event ,就变成了事件
private void button1_Click(object sender, EventArgs e)
{
i++;
if (i==3)
{
i = 0;
if (this._mdl!=null)//this。。点出来可以发现——mdl 是一个闪电的图标
{
this._mdl();//调用方法
}
}
}
}
}
总结:
委托和事件的区别
1、委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装。),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。(举例子:三种实现事件方式的区别(直接用委托实现、用私有委托+公有方法模拟事件,直接用event事件实现))
2、因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。add、remove。
3、事件是用来阉割委托实例的。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。
总结:
1、委托的作用:
占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。
2、事件的作用:
事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)
3、在自定义控件(自己编写控件的时候,会大量用到.编写控件的时候,会写一些事件。但是当这些事件 被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),具体调用的是哪个方法,由使用控件的人来决定(Click+=new 委托(方法名);))