事件就是对委托的一个封装
事件的本质是将方法赋值给事件属性(本质就是一个变量)
C#中的按钮,如果为它的CLICK属性添加一个方法引用地址,那么当按钮被用户点击时,程序就会调用Click属性里的方法。
//将方法的地址存入到click属性
this.button1.Click += new System.EventHandler(this.button1_Click);
document.getElementById('button').οnclick=function(){};
委托是什么?委托是一个能存放方法指针的容器,并且能存放多个方法的引用
注意:不能存放签名和委托签名不一致的方法
委托的目的:一、将方法作为参数和返回值传递
委托的缺点:把不知道的方法移除掉了,可以私有化委托变量
调用一个委托,执行N个方法---(多播委托)
一、委托基本语法
//1.声明一个委托类(必须指定返回值类型和方法参数列表)</span>
public delegate void DGsayhi();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//2.创建委托对象,并为对象添加一个方法指针(方法对象)。
DGsayhi dgSayHi = new DGsayhi(SayHiChina);
//3.调用委托(委托对象内部的方法就会被调用)
dgSayHi();
}
void SayHiChina()
{
MessageBox.Show("你好~~");
}
}
二、委托的作用
1、将方法作为参数使用(目的将方法的指针装入委托对象,并传入某个方法)
public delegate void DGTest();
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
void Test1()
{ MessageBox.Show("test1"); }
void Test2()
{ MessageBox.Show("test2"); }
void Test3()
{ MessageBox.Show("test3"); }
private void btnprar_Click(object sender, EventArgs e)
{
InvokeTest(Test2);
}
//委托当参数用:调用3个test方法的某一个
public void InvokeTest(DGTest dgTest)
{
dgTest();
}
}
2、将方法作为返回值
public delegate void DGTest();
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
void Test1()
{ MessageBox.Show("test1"); }
void Test2()
{ MessageBox.Show("test2"); }
void Test3()
{ MessageBox.Show("test3"); }
//委托当参数用:调用3个test方法的某一个
private void btnreturn_Click(object sender, EventArgs e)
{
DGTest dg = InvokeTest("1");
dg();
}
//委托当返回值用
public DGTest InvokeTest(string strType)
{
switch (strType)
{
case "1":
return Test1;
case "2":
return Test2;
default:
return Test3;
}
}
}
3、循环集合,并调用方法
public delegate void DGEachFun(int idnex, object item);
//遍历集合,并调用传入的回调方法
public void Each(ArrayList list, DGEachFun dgEachFun)
{
for (int i = 0; i < list.Count; i++)
{
dgEachFun(i, list[i]);
}
}
void ShowName(int index, object item)
{
MessageBox.Show(index + "item" + item);
}
private void btnEach_Click(object sender, EventArgs e)
{
ArrayList list = new ArrayList();
list.Add("a");
list.Add("b");
list.Add("c");
list.Add("d");
Each(list, ShowName);
}
4、利用委托排序
private void button2_Click(object sender, EventArgs e)
{
List<dog> list = new List<dog>();
list.Add(new dog() { name = "小白", age = 12 });
list.Add(new dog() { name = "小黑", age = 11 });
list.Add(new dog() { name = "小辉", age = 15 });
//传入的参数为符合Comparison委托签名的方法
list.Sort(ComparisonDog);
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i].name.ToString()+"age="+list[i].age.ToString());
}
}
int ComparisonDog(dog x, dog y)
{
return x.age - y.age;
}
5、利用委托加工字符串
private void btnMakeString_Click(object sender, EventArgs e)
{
string[] strArr = new string[] { "小白", "小黑", "小黄", "小灰" };
string[] strNew = MakeUpStrArr(strArr, MakeUpStr);
foreach (var item in strNew)
{
Console.WriteLine(item.ToString());
}
}
string MakeUpStr(string str)
{
return str += "hello ";
}
public delegate string DGmakeStr(string str);
string[] MakeUpStrArr(string[] arrStr, DGmakeStr dgs)
{
// string[] arrstringNew = new string[arrStr.Length];
for (int i = 0; i < arrStr.Length; i++)
{
arrStr[i] = dgs(arrStr[i]);
}
return arrStr;
}
三、事件
namespace 自定义按钮
{
delegate void DGMyTirpButton();
//三击按钮类-点击3次执行方法
class MyTirpButton : System.Windows.Forms.Button
{
public MyTirpButton()
{
//每当被点击的时候此方法会被调用
base.Click += MyTirpButton_Click;
}
int times = 0;
public event DGMyTirpButton dgmb;
void MyTirpButton_Click(object sender, EventArgs e)
{
if (times < 2)
{
times++;
}
else//点击3次后
{
if (dgmb != null)
dgmb();
times = 0;
}
}
}
}
调用3击事件
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
myTirpButton1.dgmb+=myTirpButton1_dgmb;
}
void myTirpButton1_dgmb()
{
MessageBox.Show("启动,您已点击了3次");
}
}