哪位高手给写个并解释下什么是自定义事件,小弟对这块一直很模糊,
最后写下声明的那条语句,并且每个单词都给出明确的解释,比如:+=号是绑定方法的意思吗?
一直似懂非懂!!!

解决方案 »

  1.   

    按MSDN的解释,事件也就是向其他类或对象通知发生的相关事情,例如用户点击鼠标会发生Clcik事件,移动会产生Move事件。
    这些都是系统默认的事件,所以我们可以直接使用而不用管它什么时候触发。
    自定义事件就需要手工触发事件,也就是说在什么时候通知其他类或者对象发生了这件事。说得好乱,文字不是强项,不说了,看楼下的
      

  2.   

    事件就是基于windows消息处理机制的,当捕捉到特定的消息,事件便发生了。操作系统将消息传送给对象,而对象事先已经注册了事件的处理方法作为回调函数告诉操作系统。所以操作系统不必知道程序的内部工作机制,只要传递消息就可以。     //比如动态生成一个按钮
         Button button1 = new Button();    // 产生一个事件处理的委托实例并添加到产生的事件列表中
         button1.OnClick += new EventHandler( this.buttonClick );
        
        //这里是真正处理事件的函数
        private void buttonClick(object sender, KeyEventArgs e)
        {
            MessageBox.Show( "just click me");
        }
      

  3.   

    +=是添加一个处理函数
    如果直接用=会将默认的覆盖掉,所以一般用+=
    其实就当是普通的+=就好了
    int i = 1;
    i += 2;    //i = 1 + 2;
    i = 2;     // i = 2;
      

  4.   

    事件就是正在发生的,或即将发生的case。通过一些主动的或被动的动作去触了他。事件的发生要有一个生存时间的。关于具体的代码可以到百度知道上去搜搜看。
      

  5.   

    EventHandler是一个预定义的委托。public delegate void EventHandler(Object sender, EventArgs e);其实是定义了一个标准的windows事件回调函数的原型。
    如果要添加标准的事件处理,都可以直接按照这样原型来写事件处理函数。比如前面写的
        private void buttonClick(object sender, KeyEventArgs e) 
        { 
            MessageBox.Show( "just click me"); 
        }当你做的是自定义事件时,根据你的需要要传递的参数可能跟这个原型有所出入,这时候就需要你自己定义一个委托了。
    而你的事件处理函数也是依照你定义的委托来写。
      

  6.   

    事件就是一种通知机制,可以在必要的时候才触发某段代码执行.
    .NET中的事件是基于委托的.
    +=就是添加一个事件/委托处理程序,它是delegate类中重载的运算符.你理解为Add就好了
      

  7.   


    系统默认的事件,应该是基于消息处理的,但自定义的事件,就需要一个触发的时机,例如:        // 定义超时委托
            delegate void Timeout();
            // 定义超时事件
            event Timeout TimeoutEven;        // 事件处理函数
            private void EventFunction()
            {
                m_iTimeout = 0;
                m_bPlay = false;
                MessageBox.Show("时间到了");
            }        private int m_iTimeout = 0;
            private bool m_bPlay = false;
            private void button1_Click(object sender, EventArgs e)
            {
                // 关联事件处理函数
                TimeoutEven += EventFunction;
                m_bPlay = true;            while (m_bPlay)
                {
                    if (m_iTimeout >= 10)
                    {
                        // 事件到了,触发Timeout事件
                        if (TimeoutEven != null)
                        {
                            TimeoutEven();
                        }
                    }                System.Threading.Thread.Sleep(1000);
                    Application.DoEvents();
                    m_iTimeout++;
                }
            }
      

  8.   

    事件就跟名字一样,名字就是自解释的。鼠标的点击、移动,键盘被按下、放开,所有控件属性的变化,还有来自端口的信息,只要发生了变化,就可以成为“事件”,并且传递相应的信息给系统。单纯的知道事件的发生是没有实际用途的,必须执行相应的动作,执行相应的代码,因此有了“委托”,就是告诉程序,发生了事件后应该做什么事情。一个事件可以对应多个委托以执行多个函数代码,“+=”就是你在一事件原有的委托基础上再添加多一个而已,执行的顺序等于你添加的顺序。如果你用“=”,那么就不是“添加”,而是赋值,会覆盖原有的所有委托。MSDN有关于事件和委托配合使用的专题,楼主自己去看看,例子都很简单的
      

  9.   


    自定义的事件也是基于消息处理的。这是它的本质。
    所谓触发的时机也不过是在适当的时候发送的消息。比如你在c#里用定时器,要触发一个事件。实质上是定时器是封装了setTimer这个api,它每隔一段inteval会发送一个WM_TIMER的消息。接收到这个消息之后,再去调setTimer的回调函数,即是你封装的TimeOutEvent要自定义消息也是可以的。不过c#比较麻烦,我就不写怎么做了。最后看了一下,ZengHD,觉得你写这个例子不太算事件。因为好像不是用真的定时器,而是模拟的,只是顺序执行一些函数而已,通过一些计数和sleep拖延了时间。我觉得不能算事件的。
      

  10.   

    呵呵,都是一个东西。只是事件让人感觉比较亲切,容易跟生活联系在一起容易理解吧。就好像char **argv 一般都写char argv[][]一样。本质都是同一个东西。
      

  11.   

    事件:就是一个特殊化的委托实例;特殊在什么地方呢?示例:
       //使用Action<T>委托
       class A{
         //为本类定义一个事件
          public event Action<string> SendMessage;
         //按MSDN推荐,写了事件以后你需要写一个按一定模式它的触发如下;
         protected virtual void OnSendMessage(string message)
         {
            if(this.SendMessage!=null)//X1 处
              this.SendMessage.Invoke(message);
         }       
       }
       //下面我们将使用这个定义的事件"SendMessage",
       //注意使用事件的条件是,存在一个类的引用(包含关系),被包含者的事件被使用所以..
       class B{
          //申明A的对象:
          A a;
          public B(){
           this.a=new A();
           //实例化a之后接着,"订阅"它的事件用 "+="符号
            this.a.SendMessage+=this.ShowMessage;//+=号之后,可以直接写一个方法名这样更简单
           }
          void ShowMessage(string msg){
            //你的在这里写你订阅事件的响应代码...
             MessageBox.Show(msg);
          }    
       }
      //至此整个涉及事件的内容交待完毕,下面回过来讲一下,为什么说事件是一个特殊的委托
      //它特殊在什么地方呢?个人认为是在这里;依然借用上面代码举例;
      //...
      //注意X1处,"this.SendMessage!=null",只有在定义事件的类的内部才可以设置事件
      //是否为null除此之外的其它地方,只能存在+=,-=操作  //有关更多讯息请参考MSDN的帮助.
      
      

  12.   

    事件是windows的消息驱动机制中的一个概念,事件是一个对象对对象本身和外界对象的各种状态变化的感知,当它检测到这种状态变化之后,就会给该对象一个通知.(自己的理解,仅供参考)
      

  13.   

    事件是windows的消息驱动机制中的一个概念,事件是一个对象对对象本身和外界对象的各种状态变化的感知,当它检测到这种状态变化之后,就会给该对象一个通知.(自己的理解,仅供参考)
      

  14.   

    button1.Click += delegate { button1.Text = "Clicked"; };
      

  15.   

    出事了。就是事件
    -------------------------------------------------
    北京国展大型人才招聘会(9.27)
    http://www.315job.com/YaoQingHan/20080927.html
      

  16.   

    while (m_bPlay)
                {
                    if (m_iTimeout >= 10)
                    {
                        // 事件到了,触发Timeout事件
                        if (TimeoutEven != null)
                        {
                            TimeoutEven();
                        }
                    }                System.Threading.Thread.Sleep(1000);
                    Application.DoEvents();
                    m_iTimeout++;
                }
    红星星高手,详细解释下这段代码的含义可以不,我只知道用,具体每句的含义不是太清楚。

    System.Threading.Thread.Sleep(1000);
                    Application.DoEvents();
    谢谢了
      

  17.   

    关于处理和引发事件:http://msdn.microsoft.com/zh-cn/library/edzehd2t.aspx,非常详细 
    事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。 在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。 委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。下面的示例显示了事件委托声明。 C#  复制代码 
    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e); 
    该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。 AlarmEventHandler 委托的实例可以绑定到任何一个与其签名匹配的方法上,例如下面的示例中显示的 WakeMeUp 类的 AlarmRang 方法。 public class WakeMeUp 

        // AlarmRang has the same signature as AlarmEventHandler. 
        public void AlarmRang(object sender, AlarmEventArgs e) 
        {...}; 
        ... 
    } 只有当事件生成事件数据时才需要自定义事件委托。许多事件,包括一些用户界面事件(例如鼠标单击)在内,都不生成事件数据。在这种情况下,类库中为无数据事件提供的事件委托 System.EventHandler 便足够了。其声明如下。 delegate void EventHandler(object sender, EventArgs e); 
    事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。有关详细信息,请参见 Delegate。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。 有关使用委托在您的组件或控件中提供事件功能的详细信息,请参见引发事件。 有关在您的应用程序中使用事件的概述,请参见使用事件。 
      

  18.   

    基于Windows的应用程序也是基于消息的。这说明,应用程序是通过Windows来通信的,Windows又是使用预定义的消息与应用程序通信的。这些消息是包含各种信息的结构,应用程序和Windows使用这些信息决定下一步的操作。在MFC等库或VB等开发环境推出之前,开发人员必须处理Windows发送给应用程序的消息。VB和今天的.NET把这些传送来的消息封装在事件中。如果需要响应某个消息,就应处理对应的事件。一个常见的例子是用户单击了窗体中的按钮后,Windows就会给按钮消息处理程序(有时称为Windows过程或WndProc)发送一个WM_MOUSECLICK消息。对于.NET开发人员来说,这就是按钮的OnClick事件。
      

  19.   

    楼下的,楼上的。
    帮忙解释下这两句的意思啊。
                    System.Threading.Thread.Sleep(1000); 
                    Application.DoEvents(); 
    不是很清楚呢,这两句。
    while (m_bPlay) 
                { 
                    if (m_iTimeout >= 10) 
                    { 
                        // 事件到了,触发Timeout事件 
                        if (TimeoutEven != null) 
                        { 
                            TimeoutEven(); 
                        } 
                    } 
                    System.Threading.Thread.Sleep(1000); 
                    Application.DoEvents(); 
                    m_iTimeout++; 
                } 
      

  20.   


    //线程sleep,睡眠1秒钟
    System.Threading.Thread.Sleep(1000); //为了防止在循环中程序界面假死(因为正在执行循环代码而没有处理鼠标、键盘、界面重画等其他消息)
    //所以在循环中加入这句,执行它任务队列里面的事情
    Application.DoEvents();              
      

  21.   

    事件是一个委托类型
    事件定义在类里面
    事件用于和外界通信
    public delegate void MyDelegate(Object sender, string msg); // 自定义一个委托public class Class1
    {
        public event MyDelegate OnStart; // 事件是一个委托类型    public void Start()
        {
            OnStart(this, "A Message"); // 引发事件
        }
    }private void button1_Click(object sender, EventArgs e)
    {
        Class1 class1 = new Class1();
        class1.OnStart += new MyDelegate(ShowMsg); // 方法和事件绑定    // Class1类执行这个方法,会引发OnStart事件,现实和外界通信
        class1.Start();
    }public void ShowMsg(Object sender, string msg)
    {
        // 这是处理事件的方法,sender、msg 是OnStart事件发出的信息    MessageBox.Show(msg);
    }
      

  22.   


    这个System.Threading.Thread.Sleep(1000); 休眠1秒钟,是指当前正在运行的线程吧,跟主线程有什么关系?
      

  23.   

    形象的说,事件就是类或者对象用来发送通知的成员,即事件为类和类的实例提供里向外界发送通知的能力。通过提供事件的句柄,客户能够把事件和可执行代码联系在一起。
    事件机制有如下特征:
    1 事件既可以被声明成为类域成员,也可以被声明为属性。
    2 在.net框架中,事件是将事件发送者与事件接收者相关联的一种代理类,即事件机制是通过代理来实现的。
    3 一个事件发送者可以同时发出多个处理事件的方法。
      

  24.   

    自定义的事件也是基于消息处理的。这是它的本质。 
    所谓触发的时机也不过是在适当的时候发送的消息。 比如你在c#里用定时器,要触发一个事件。实质上是定时器是封装了setTimer这个api,它每隔一段inteval会发送一个WM_TIMER的消息。接收到这个消息之后,再去调setTimer的回调函数,即是你封装的TimeOutEvent 要自定义消息也是可以的。不过c#比较麻烦,我就不写怎么做了。 最后看了一下,ZengHD,觉得你写这个例子不太算事件。因为好像不是用真的定时器,而是模拟的,只是顺序执行一些函数而已,通过一些计数和sleep拖延了时间。我觉得不能算事件的。