马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

一个有点钻牛角尖的问题,望楠婶不吝赐教~~

  [复制链接]
查看8813 | 回复7 | 2014-12-2 12:04:50 | 显示全部楼层 |阅读模式
委托和事件
我理解委托是一种封装的指针,它可以把方法作为变量来传递和使用。
事件是一种特殊的委托,它限定了委托只能增加和删减。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 委托实现事件1
{
    class Program
    {
        static void Main(string[] args)
        {
            Counter c = new Counter();
            //告诉Counter:当数到10的倍数的时候请调用_On10
            c.On10 = _On10;//相当于一个事件
            //c.On10 = _On102;
            c.On10 =c.On10 + _On102;//可以多个人同时听了
           // c.On10 += _On102;
            while (true)
            {
                c.Next();----------------------------调用这个方法触发了委托
            }
            Console.ReadKey();
        }
        //value怎么传过来Counter使用者不用关心
        static void _On10(int value)
        {
            Console.WriteLine("10的倍数:"+value);
        }
        //value怎么传过来Counter使用者不用关心
        static void _On102(int value)
        {
            Console.WriteLine("我也听到了10的倍数:" + value);
        }
    }
    class Counter
    {
        public OnCountDelegate On10;//把委托对象声明为一个字段
        private int i=0;
        public void Next()//-----------------------------------------------------------------委托的触发方法
        {
            i++;
            if (i % 10 == 0)
            {
                if (On10 != null)
                {
                    On10(i);//调用On10指向的函数,相当于把事件通知出去
                }
            }
        }
    }
    delegate void OnCountDelegate(int value);
}
===============================================
这段代码用委托来模拟事件。
通过这段代码可以很清晰的看出委托的使用。

那么问题来了:
    事件得有个触发机制。 我们比如在系统给定好的BUTTON控件里使用CLICK事件。 那么这个CLICK事件的触发机制是在哪里呢?是什么样的呢?
    即使学了委托和事件这两个概念,但我依然想不明白,控件的BUTTON的CLICK事件到底是怎么被触发的? 那个EventHandler的委托对象是什么时候被调用的?怎么被调用的?

ibcadmin | 2014-12-2 15:41:52 | 显示全部楼层
这个我怎么解释呢.....
委托么, 顾名思义 , 就是你做不了的事 要让别人去做,    你的类处理不了的事, 你要让别的类处理
你说的这个click事件的话  我就这样解释。
  你现在有一个asp.net web窗体,  还有一个用户自定义控件,这个web窗体拖用户控件来,这个控件主要是处理登陆操作,登陆的按钮是在控件中的, 但是用户名密码是在web窗体上, 所以现在要做的就是 点击这个按钮 吧用户名密码传给控件 看看是否登陆成功。
  就是你这个WEB窗体上并不能知道用户是否登陆成功,你要委托给控件的登陆事件去做。

我这样说可能还是有点不合理,不过大概意思就是这样了
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
韠麣龘龘爨矲鼶 | 2014-12-2 15:59:22 | 显示全部楼层
ibcadmin 发表于 2014-12-2 15:41
这个我怎么解释呢.....
委托么, 顾名思义 , 就是你做不了的事 要让别人去做,    你的类处理不了的事, ...

我要问的不是这个意思,并不是我不理解事件的用法。而是不懂例如CLICK事件是如何被触发的。

一个程序运行时,单机按钮控件,鼠标就发送一个消息给WINDOWS,WINDOWS又把这个消息转给程序,对吧?    那么程序在接到消息之后,又是如何触发来调用这个事件方法呢?      对于这一流程我不太理解。  

就好比我上面的例子Counter类,我在MAIN方法的while循环里调用它的next方法,以此为入口,触发使用了On10这个委托。   那么系统封装好的click事件,keydown事件 。它内部是怎么调用这个click事件对象的呢?
ibcadmin | 2014-12-2 16:06:11 | 显示全部楼层
韠麣龘龘爨矲鼶 发表于 2014-12-2 07:59
我要问的不是这个意思,并不是我不理解事件的用法。而是不懂例如CLICK事件是如何被触发的。

一个程序 ...

  你这问的高端啊...... 你像这种keydown这种事件都是都是封装好的, 这我也不清楚为什么按了键盘就会触发keydown事件...
   但是简单的事件也好解释,比如你有一个集合 当你删除集合中的某一索引时,你会重新绑定集合,这都是你自己手写的.. 我好乱啊..被你问蒙圈了..   这种事 我确实也不知道为什么会发生..
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
韠麣龘龘爨矲鼶 | 2014-12-2 16:15:16 | 显示全部楼层
ibcadmin 发表于 2014-12-2 16:06
你这问的高端啊...... 你像这种keydown这种事件都是都是封装好的, 这我也不清楚为什么按了键盘就会触发 ...

其实应该就是其底层的原理吧?  光学了事件和委托,却不知道CLICK事件和KEDOWN事件是如何。感觉怪膈应得。每每想到于此总觉得还是不太理解事件和委托。   
现在,我就知道一个多线程需要用到委托,但我也没用过没学过多线程。 光知道委托,但却不知道其什么时候我自己要用了。
ibcadmin | 2014-12-2 16:25:25 | 显示全部楼层
韠麣龘龘爨矲鼶 发表于 2014-12-2 08:15
其实应该就是其底层的原理吧?  光学了事件和委托,却不知道CLICK事件和KEDOWN事件是如何。感觉怪膈应得 ...

项目里最常会用到委托事件的 也就是用户控件了
我的经验告诉你  当你做一个用户控件时  发现在窗体上获取不到控件上的值了 这时候不要着急  开始用委托就行了
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
韠麣龘龘爨矲鼶 | 2014-12-2 16:30:05 | 显示全部楼层
ibcadmin 发表于 2014-12-2 16:25
项目里最常会用到委托事件的 也就是用户控件了
我的经验告诉你  当你做一个用户控件时  发现在窗体上获 ...

这个就不太理解了
ibcadmin | 2014-12-2 16:32:27 | 显示全部楼层

还是靠经验去理解吧   多做项目  
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则