1.首先给一张图让大家了解什么是委托?它的优缺点是什么?

2.通过代码的运用更深入地了解委托事件(窗体应用程序)

1)下面我们先定义一个无参数的委托。

  //1.0 定义一个自定义的委托,此委托的签名是,无返回值void 无参数
public delegate void DmyFirstHander();

2)在需要使用委托的方法块中调用委托。

            //1.0 定义一个委托对象,载入实例方法
DmyFirstHander d = new DmyFirstHander(SayHelloCH); //2.0 向委托对象d追加一个方法,+=:其实是给程序员开发方便而产生的语法糖,最终编译器会将语法糖编译成真正的.net代码
//Delegate.Combine()
d += Form1.SayHelloEN; d -= SayHelloCH; //缺点:造成委托对象不可控
d = null; //调用委托,d.Invoke();
d();

委托对象载入的实例方法是

    void SayHelloCH()
{
MessageBox.Show("你好呀,小北京");
} static void SayHelloEN()
{
MessageBox.Show("Hello beijing");
}

3)然后就会得到提示框输出“Hello beijing”

3.下面给一张图让大家了解委托操作代码的本质。

4.一些委托的扩展知识:

1)利用GetInvocationList()获取当前委托对象中的所有方法的单个委托

  //利用GetInvocationList()获取当前委托对象中的所有方法的单个委托
Delegate[] darr = d2.GetInvocationList();

2) 遍历所有方法的委托

  List<string> reslist = new List<string>();

            //遍历所有方法的委托
foreach (Delegate item in darr)
{
//执行方法委托讲返回结构加入到List<>集合中
reslist.Add((item as DmySecHander).Invoke()); //DmySecHander dsH = item as DmySecHander;
//dsH(100);
}

3)通过string.Join以换行的方式将集合中的所有数据输出到变量res

string res = string.Join("\r\n", reslist);

4)利用自定义委托处理字符串

  public delegate string DProcessString(string str);

        private void button3_Click(object sender, EventArgs e)
{
string str = "Hello";
//1.0 对字符串进行转大写处理
MessageBox.Show(ProcessString(str, toupperstr)); //2.0 对str字符串追加一个!
MessageBox.Show(ProcessString(str, AddStr));
} string ProcessString(string str, DProcessString dprocessor)
{
str += "???????"; return dprocessor.Invoke(str);
}

string AddStr(string str)
{
return str + "!";
}


string tolowerstr(string str)
{
return str.ToLower();
}


string toupperstr(string str)
{
return str.ToUpper();
}


5)利用系统委托进行排序

    private void button4_Click(object sender, EventArgs e)
{
//对整数进行排序
//int[] arr = { 1, 2, 5, 0 }; //List<int> list = arr.ToList(); ////对list集合进行倒序排列
//list.Sort(Comp); //MessageBox.Show(string.Join("\n\r", list)); //2.0 对一个字符串进行排序
List<string> slist = new List<string>() { "a", "ab", "abc" }; slist.Sort(Compstring);
MessageBox.Show(string.Join("\n\r", slist));
} /// <summary>
/// 负责处理倒序逻辑
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
int Comp(int x, int y)
{
return y - x;
} int Compstring(string x, string y)
{
return y.Length - x.Length;
}

6)获取数组最大值

   public delegate bool DmyComp(object x, object y);

        private void button5_Click(object sender, EventArgs e)
{
#region 3.0.1 获取数组最大值(整数)
//object[] intArr = { 1, 0, 3, 2, 4 }; //object maxobj = GetMax(intArr, intComp); //MessageBox.Show(maxobj.ToString());
#endregion #region 3.0.2获取pig对象数组的年龄最大的pig对象 object[] arrPig = {
new Pig(){ Name="八戒", Age=},
new Pig(){ Name="小猪", Age=},
new Pig(){ Name="野猪", Age=}
}; object pig = GetMax(arrPig, PigComaByAge); Pig maxPig = pig as Pig;
MessageBox.Show("Name" + maxPig.Name + " age=" + maxPig.Age); #endregion
} bool PigComaByAge(object p1, object p2)
{
Pig pig1 = p1 as Pig;
Pig pig2 = p2 as Pig; return pig1.Age - pig2.Age > ;
} /// <summary>
/// 负责比较两个整数的大小
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
bool intComp(object x, object y)
{
return (int)x - (int)y > ;
} object GetMax(object[] arr, DmyComp comp)
{
//1.0 假设arr数组0下标的值就是最大
object max = arr[]; //2.0 比较当前数组中的所有数据是否要大于max,如果大于则替换max的值
for (int i = ; i < arr.Length; i++)
{
//判断如果大于则替换max的值
if (comp(arr[i], max))
{
max = arr[i];
}
} return max;
}

7)利用事件向委托注册方法,并调用

   /// <summary>
/// 负责定义事件
/// </summary>
public class DelegateHelper
{
public static event DmyFirstHander OnFirstHander;
// public static event DmySecHander OnSecHander; /// <summary>
/// 负责触发事件方法
/// </summary>
public static void Run()
{
if (OnFirstHander != null)
{
//执行事件
OnFirstHander(); //本质: OnFirstHander.Invoke();
}
}
    /*
利用事件的优点:
* 1、对委托进行了封装,只允许程序员进行 +=,和 -=操作,不允许进行直接赋值
* 2、一般是定义在类中,语法:public event DmyFirstHander myFirstHander;
3、利用事件操作委托,底层 1、拆成了一个私有的静态的委托变量 2、通过add_xx() ,remove_xxx()向私有的静态的委托变量 加方法和移除方法
*/
private void button6_Click(object sender, EventArgs e)
{
//注册一个sayHelloCH
//事件的+=本质:add_OnFirstHander()
DelegateHelper.OnFirstHander += SayHelloCH; //报错:事件只能出现在+=,-=的左边,而此处出现在了=的左边
//DelegateHelper.OnFirstHander = null;
DelegateHelper.OnFirstHander += Form1.SayHelloEN;
//事件的+=本质:remove_OnFirstHander()
DelegateHelper.OnFirstHander -= SayHelloCH; //触发事件
DelegateHelper.Run();
}

ASP.Net 之委托事件的更多相关文章

  1. Asp.net用户控件和委托事件

    在Asp.net系统制作过程中,门户类型的网站,我们可以用DIV+CSS+JS+Ajax全部搞定,但是一旦遇到界面元素比较复杂的时候,还是UserControl比较方便一些,各种封装,各种处理,然后拖 ...

  2. C# ~ 从 委托事件 到 观察者模式 - Observer

    委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...

  3. C#委托,事件理解入门 (译稿)

    原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...

  4. 关于ios使用jquery的on,委托事件失效

    $('.parents').on("click",'.child',function(){}); 类似上面这种,在ios上点击"child"元素不会起作用,解决 ...

  5. asp.net(C#)页面事件顺序

    asp.net(C#)页面事件顺序 http://www.cnblogs.com/henw/archive/2012/02/09/2343994.html   1 using System.Data; ...

  6. Observer设计模式中-委托事件-应用在消息在窗体上显示

    Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...

  7. jQuery里面的普通绑定事件和on委托事件

    以click事件为例: 普通绑定事件:$('.btn1').click(function(){}绑定 on绑定事件:$(document).on('click','.btn2',function(){ ...

  8. 关于asp.net中页面事件加载的先后顺序

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  9. c#基础学习笔记-----------委托事件

    这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...

随机推荐

  1. python--深浅拷贝 join() 列表和字典的删除 fromkeys建立字典

    北京的冬天雾霾依旧很重,依稀记得人生初见雾霾时的样子,那时的回忆也是有些尴尬,不过雾霾也伴随了我的成长,成为了我肺泡中不可分割的一部分. 今天我想写的是拷贝的问题,不过在这之前我想先补充一点关于字符串 ...

  2. 鸡肋点搭配ClickJacking攻击-获取管理员权限

    作者:jing0102 前言 有一段时间没做测试了,偶尔的时候也会去挖挖洞.本文章要写的东西是我利用ClickJacking拿下管理员权限的测试过程.但在说明过程之前,先带大家了解一下ClickJac ...

  3. leetcode-74-搜索二维矩阵

    题目描述:  编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: ...

  4. 架构师养成记--20.netty的tcp拆包粘包问题

    问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...

  5. jQuery 事件注册

    重点事件注册.on() <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...

  6. Secondary NameNode究竟是做什么的

    Secondary NameNode:它究竟有什么作用? 在hadoop中,有一些命名不好的模块,Secondary NameNode是其中之一.从它的名字上看,它给人的感觉就像是NameNode的备 ...

  7. SpringMVC初写(四)上传和下载功能的实现

    一.文件上传 流程: 导入包commons-fileuplad组件和依赖包commons-io组件 配置springmvc支持上传的组件: 启动SpringMVC注解支持 配置上传解释器 构建一个上传 ...

  8. Sublime Text 3插件收集

    0.Package Control 这个是必须装的,就不多解释了 1.ConvertToUTF8 支持 GBK, BIG5, EUC-KR, EUC-JP, Shift_JIS 等编码的插件. 2.B ...

  9. Winform控件的问题汇总

    2014-01-19号 用户控件中的子控件(Btn控件),想要暴露到用户控件之外,以供其它其他控件使用的解决方法 1.在用户控件中定义一个委托和这个委托的事件. public delegate voi ...

  10. .NET(C#):使用反射来获取枚举的名称、值和特性

    首先需要从内部了解一下枚举(Enumeration),相信许多人已经知道了,当我们声明一个这样的枚举类型: enum MyEnum { AAA, BBB, CCC } 背后的IL是这样的: .clas ...