| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 508 人关注过本帖
标题:【求助】事件数据
只看楼主 加入收藏
Initial
Rank: 1
等 级:新手上路
帖 子:26
专家分:7
注 册:2009-8-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
【求助】事件数据
Initial在看MSDN时对这样的一段话不理解:
 “事件处理程序委托的标准签名定义一个没有返回值的方法,其第一个参数的类型为  Object,它引用引发事件的实例,第二个参数从  EventArgs 类型派生,它保存事件数据。如果事件不生成事件数据,则第二个参数只是  EventArgs 的一个实例。否则,第二个参数为从  EventArgs 派生的自定义类型,提供保存事件数据所需的全部字段或属性。”
  疑惑是:
1)sender实例怎么引发事件
2)什么是事件数据
3)从  EventArgs 类型派生的参数e怎么保存事件数据
 Initial先给大家谢过~~
搜索更多相关主题的帖子: 数据 
2009-08-02 21:22
Initial
Rank: 1
等 级:新手上路
帖 子:26
专家分:7
注 册:2009-8-1
收藏
得分:0 
下面的过程说明如何在类中实现事件。第一个过程实现没有关联数据的事件,它将 System..::.EventArgs 类和 System..::.EventHandler 类用作事件数据和委托处理程序。第二个过程实现具有自定义数据的事件,它为事件数据和事件委托处理程序定义自定义类。

有关阐释引发和处理事件的完整示例,请参见 如何:引发和使用事件。
实现不具有事件特定的数据的事件

   1.

      在类中定义公共事件成员。将事件成员的类型设置为 System..::.EventHandler 委托。
      C#

      public class Countdown
      {
          ...
          public event EventHandler CountdownCompleted;   
      }

      Visual Basic

      Public Class Countdown
          ...
          Public Event CountdownCompleted As EventHandler
      End Class

   2.

      在引发事件的类中提供一个受保护的方法。对 OnEventName 方法进行命名。在该方法中引发该事件。
      C#

      public class Countdown
      {
          ...
          public event EventHandler CountdownCompleted;   
          protected virtual void OnCountdownCompleted(EventArgs e)    {        if (CountdownCompleted != null)            CountdownCompleted(this, e);    }
      }

      Visual Basic

      Public Class Countdown
         ...
         Public Event CountdownCompleted As EventHandler
         Protected Overridable Sub OnCountdownCompleted(e As EventArgs)      RaiseEvent CountdownCompleted(Me, e)   End Sub
      End Class

   3.

      在类中确定引发该事件的时间。调用 OnEventName 以引发该事件。
      C#

      public class Countdown
      {
          ...
          public void Decrement
          {
              internalCounter = internalCounter - 1;
              if (internalCounter == 0)
                  OnCountdownCompleted(new EventArgs());
          }
      }

      Visual Basic

      Public Class Countdown
          ...
          Public Function Decrement
              InternalCounter = internalCounter - 1
              If internalCounter = 0
                  OnCountdownComplete(New EventArgs())
              End If
          End Function
      End Class

实现具有事件特定的数据的事件

   1.

      定义一个提供事件数据的类。对类 EventNameArgs 进行命名,从 System..::.EventArgs 派生该类,然后添加所有事件特定的成员。
      C#

      public class AlarmEventArgs : EventArgs
      {
         private readonly int nrings = 0;
         private readonly bool snoozePressed = false;
         
         //Constructor.
         public AlarmEventArgs(bool snoozePressed, int nrings)
         {
            this.snoozePressed = snoozePressed;
            this.nrings = nrings;
         }
         
         //Properties.
         public string AlarmText {  
            ...
         }
         public int NumRings {
            ...
         }
         public bool SnoozePressed{
            ...
         }
      }

      Visual Basic

      Public Class AlarmEventArgs
         Inherits EventArgs
         Private nrings As Integer = 0
         Private _snoozePressed As Boolean = False
         
         'Constructor.
         Public Sub New(ByVal snoozePressed As Boolean, ByVal nrings As Integer)
            Me.snoozePressed = snoozePressed
            Me.nrings = nrings
         End Sub
         
         'Properties.
         Public ReadOnly Property AlarmText() As String
            ...
         End Property
         
         Public ReadOnly Property NumRings() As Integer
            ...
         End Property
         
         Public ReadOnly Property SnoozePressed() As Boolean
            ...
         End Property
      End Class

   2.

      声明事件的委托。对委托 EventNameEventHandler 进行命名。
      C#

      public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);

      Visual Basic

      Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)

   3.

      在类中定义名为 EventName 的公共事件成员。将事件成员的类型设置为事件委托类型。
      C#

      public class AlarmClock
      {
          ...
          public event AlarmEventHandler Alarm;
      }

      Visual Basic

      Public Class AlarmClock
          ...
          Public Event Alarm As AlarmEventHandler
      End Class

   4.

      在引发事件的类中定义一个受保护的方法。对 OnEventName 方法进行命名。在该方法中引发该事件。
      C#

      public class AlarmClock
      {
          ...
          public event AlarmHandler Alarm;
          protected virtual void OnAlarm(AlarmEventArgs e)    {      if (Alarm != null)           Alarm(this, e);     }
      }

      Visual Basic

      Public Class AlarmClock
          ...
          Public Event Alarm As AlarmEventHandler
          Protected Overridable Sub OnAlarm(e As AlarmEventArgs)        RaiseEvent Alarm(Me, e)    End Sub
      End Class

   5.

      在类中确定引发该事件的时间。调用 OnEventName 以引发该事件并使用 EventNameEventArgs 传入事件特定的数据。
      C#

      Public Class AlarmClock
      {
          ...
          public void Start()
          {
              ...
              System.Threading.Thread.Sleep(300);
              AlarmEventArgs e = new AlarmEventArgs(false, 0);
              OnAlarm(e);
          }
      }
2009-08-02 22:12
yangglemu
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:521
注 册:2006-9-15
收藏
得分:20 
1)sender实例怎么引发事件
2)什么是事件数据
3)从  EventArgs 类型派生的参数e怎么保存事件数据
-------------------------------------------------
1)Sender实例引发事件是由操作系统调度的,Windows操作系统是一个巨大的消息循环系统,时刻监视着相关设备的一举一动
  当相关设备有行为发生时(经如鼠标单击),截获这一行为,并发送到相关注册的处理程序进行处理,举个简单的例子:
  while(ture)
 {
   if(鼠标左键接下)
     DoSomeThing();
    if(键盘Shift键接下)
     DoAthotherThing();
    ...   
 }
 2)事件数据,就是与产生事件的主体相关的数据,如鼠标按下事件的e里就包括鼠标的坐标,是哪个键等等

 3)之所以规定要从EventArgs派生,是微软的规定,并能享受面向对象的好处(子类能替换基类),其实EventArgs是个啥都没有的抽象基类,要使用,必须派生一个自己的类,如:
  MyEventAgrs:EventArgs
{
 public int x=10;
 public int y=20;
}
 然后就可以使用了:
 someevent(object sender, MyEventAgrs e)
 {
    console.writeline(e.x+e.y);
}
因为使用.net的委托EventHandle需要一个EventArgs参数,而上面的MyEventArgs是从EventArgs派生的,能自动转换为EventArs类型,还有另一种用法:
someevent(object sender, EventArgs e)
{
 if(e is MyEventArgs)
{
  MyEventArgs ee=e as MyEventArgs;
  Console.writeline(e.x+e.y);
}
}

使用何种,要看委托是自定义的,还是利用系统的EventHandle

试着挣个威望!
2009-08-03 11:56
test1021
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2008-10-21
收藏
得分:0 
以下是引用yangglemu在2009-8-3 11:56的发言:

1)sender实例怎么引发事件
2)什么是事件数据
3)从  EventArgs 类型派生的参数e怎么保存事件数据
-------------------------------------------------
1)Sender实例引发事件是由操作系统调度的,Windows操作系统 ...


请知道的人来帮忙啊
2009-08-03 15:46
快速回复:【求助】事件数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016488 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved