韠麣龘龘爨矲鼶 发表于 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窗体上并不能知道用户是否登陆成功,你要委托给控件的登陆事件去做。

我这样说可能还是有点不合理,不过大概意思就是这样了

韠麣龘龘爨矲鼶 发表于 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事件...
   但是简单的事件也好解释,比如你有一个集合 当你删除集合中的某一索引时,你会重新绑定集合,这都是你自己手写的.. 我好乱啊..被你问蒙圈了..   这种事 我确实也不知道为什么会发生..

韠麣龘龘爨矲鼶 发表于 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事件是如何。感觉怪膈应得 ...

项目里最常会用到委托事件的 也就是用户控件了
我的经验告诉你当你做一个用户控件时发现在窗体上获取不到控件上的值了 这时候不要着急开始用委托就行了

韠麣龘龘爨矲鼶 发表于 2014-12-2 16:30:05

ibcadmin 发表于 2014-12-2 16:25
项目里最常会用到委托事件的 也就是用户控件了
我的经验告诉你当你做一个用户控件时发现在窗体上获 ...

这个就不太理解了:L

ibcadmin 发表于 2014-12-2 16:32:27

韠麣龘龘爨矲鼶 发表于 2014-12-2 08:30
这个就不太理解了

还是靠经验去理解吧   多做项目
页: [1]
查看完整版本: 一个有点钻牛角尖的问题,望楠婶不吝赐教~~