ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:22.07KB ,
资源ID:4329428      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4329428.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(事件学习.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

事件学习.docx

1、事件学习1、声明一个代理。(代理可以处理某种参数类型并返回结果的一类方法,比如代理输入两个int型数据返回int型数据)2、利用代理声明一个事件。(具体某一种事件)3、定义一个方法调用事件。(怎么触发事件)4、创建一个处理事件的方法。(事件触发后执行声明代码)5、将处理事件的方法和事件关联。(多重关联/注册事件处理函数)事件:自定义事件与控件的事件。微软帮我们做了一部分工作,使得我们把注意力集中到事件执行方法的设计和编码上。初学者弄懂执行原理才有助于提高编程能力。、声明事件委托:delegate C、声明事件Event:A.event、声明事件响应函数:B.fuction、关联事件和响应函数:

2、A.event += C(B.fuction);、创建并调用触发方法:A触发,B处理区别消息和事件:架构:namespace Apublic delegate int Mydelegate(int a,int b);class Addpublic Event Mydelegate myEvent;public void function(int a,int b)if(myEvent != null)myEvent(a,b);class Appprivate stiatic void Onfunction(int a,int b)/Dosomething();class main()Add ad

3、d = new App();Add.myEvent += new Mydelegate(App.Onfuction);add.function(1,2);完整实例:包括自定义事件和系统自带事件。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Timers;/using System.Timers;namespace EventTest /定义?一?个?委托狣MessageHandler,?可以?看作痢?是?一?个?类?。 public delegate

4、void MessageHandler(string messageText); class Connections /定义?一?个?事?件tMessageArrive,?是?委托狣的?实害?例 public event MessageHandler MessageArrive; private Timer pollTimer; private static Random random = new Random(); public Connections() this.pollTimer = new Timer(); /系统?内部?:阰public delegate void ElapsedE

5、ventHandler(object sender, ElapsedEventArgs e); /系统?内部?:阰public event ElapsedEventHandler Elapsed;说明已?经-帮?我们?做?好?了?定义?委托狣和定义?事?件t两?个?步?骤 pollTimer.Elapsed += new ElapsedEventHandler(Display); public void Connect() pollTimer.Start(); public void Disconnect() pollTimer.Stop(); public void Display(obje

6、ct source, ElapsedEventArgs e) Console.WriteLine(New Message Coming); if (random.Next(9) = 0 & MessageArrive != null) /触洌?发镸essageArrive事?件t MessageArrive(New Message Arrived, And has been handled successfully); static void Main(string args) Connections connector = new Connections(); Display display

7、or = new Display(); /将?一?个?委托狣实害?例 赋3值给?事?件tMessageArrive,?参?数簓为a方?法 isplayMessage,方?法?的?参?数簓要癮与?委托狣类?的?参?数簓一?致?。 connector.MessageArrive += new MessageHandler(displayor.DisplayMessage); connector.Connect(); Console.ReadKey(); public class Display public void DisplayMessage(string text) Console.Writ

8、eLine(text); MSDN的解释:类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。 在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。 可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。 IDE 会自动添加空事件处理程序方法和订阅事件的代码。 有关更多信息,请参见 如何:订阅和取消订阅事件(C# 编程指南)。 事件概述-事件具有以下特点:发行者确定何时引发事件,订户确定执行何种操作来响应该事件。一个事件可以有多

9、个订户。 一个订户可处理来自多个发行者的多个事件。 没有订户的事件永远也不会引发。事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。 要异步调用事件,请参见使用异步方式调用同步方法。 在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。 http:/127.0.0.1:47873/help/2-19700/ms.help?product=VS&productVersion=100&method=f1&query=System.EventHan

10、dler1%00EventHandler&locale=zh-CN&category=DevLang%3acsharp%00TargetFrameworkMoniker%3a.NETFramework,Version%3Dv4.0泛型委托:程序源码就是使用这种。/ This example demonstrates the EventHandler delegate.using System;using System.Collections.Generic;/-public class MyEventArgs : EventArgs private string msg; public MyE

11、ventArgs( string messageData ) msg = messageData; public string Message get return msg; set msg = value; /-public class HasEvent/ Declare an event of delegate type EventHandler of / MyEventArgs. public event EventHandler SampleEvent; public void DemoEvent(string val) / Copy to a temporary variable t

12、o be thread-safe. EventHandler temp = SampleEvent; if (temp != null) temp(this, new MyEventArgs(val); /-public class Sample public static void Main() HasEvent he = new HasEvent(); he.SampleEvent += new EventHandler(SampleEventHandler); he.DemoEvent(Hey there, Bruce!); he.DemoEvent(How are you today?

13、); he.DemoEvent(Im pretty good.); he.DemoEvent(Thanks for asking!); private static void SampleEventHandler(object src, MyEventArgs mea) Console.WriteLine(mea.Message); /-/*This example produces the following results:Hey there, Bruce!How are you today?Im pretty good.Thanks for asking!*/当然你调用它之前还得先绑定一

14、个函数给它,不然会出错的.所以一般用if(onSayHello != null)这样判断一下,如果事件还没绑定啥函数上去就为null那既然事件都跟调用函数都差不多了,还不如直接调用函数或者调用代理,为啥搞得多此一举,再整个事件来啊.用自定义事件可能基于两种原因吧,当然这是我自己瞎猜的啊一,是体现一种设计模式,订阅者模式.二,是当体现封装原则.比如一个class想调用另外一个class中某个函数时,不想让直接调用,或者函数声明为private的,就可通过event间接的调用.因为delegate相当于指向函数的指针,而event又相当于是对delegate的封装.那你可能又问封装有啥好的啊,这可

15、能是体现一种设计思想,对以后扩充功能或做一些额外的处理有用吧.不然像像我们把所以类中的字段都给封装成一个个的属性(property),大部分时候是一点都看不出来有啥用,反而觉得有点多此一举,还不如直接用字段别用属性呢.但如果我们有时想在属性中做些额外的处理时特别有用.比如只让你读取字段值不让赋值,或者反过来.举个用自定义事件调用其他类中的private函数的简单例子吧.在class A中有private的函数sayHello.那class B中肯定不能直接调用sayHello了.当然我们另外还要假设在A中用到了B.delegate void DelegateSayHello(string na

16、me); /在类外面某个地方,它其实也可以看成一种特殊的类了.当然也可以放在某个类里面定义C#委托与事件的本质区别从定义上说,委托被编译器编译成一个类,所以它可以像类一样在任何地方定义,而事件被编译成一个委托类型的私有字段和两个公有add 和 remove 方法(有点类似于属性的定义)不过这两个方法都有一个参数,这个参数就是委托,所以,它只能定义在一个类里面。从定义可知,委托是要是需要实例化的,它4个方法:一个构造器,Invoke,BeginInvoke和EndInvoke。构造器有两个参数分别是:一个对象引用,另一个是引用回调方法的一个IntPtr。然而实例化委托的代码的参数只是一个方法的引

17、用。但这不是问题,编译器明白这其中的一切会获取对应的参数。然而事件是不需要实例化的因为他只是一个字段和两个方法,只是类的一些成员,但是可以初始化,通过一些赋值操作!实例化委托时,定义他参数的方法的参数及返回类型必须符合委托的Invoke参数及返回类型,而事件被定义后,它可以通过方法所在类的对象调用add方法来添加一个委托和remove方法来移除一个委托!而两个方法的结果是返回一个委托引用并赋值给事件定义生成的私有委托字段,如果是多次调用就返回一个委托列表头的引用。而传入的这个参数即是由要触发的方法而封装的委托。(参数为什么是委托而不直接传入一个方法引用呢,这样效率不是更高吗)因为委托是调用回调

18、方法的一种类型安全的方式。通过add方法即是订阅了一个事件,然后就是触发事件了,即通过点击按钮等输入操作即可触发事件,然后调用私有的委托变量,然后即像调用委托一样,调用他的Invoke方法即引用定义的方法的地址来执行该方法,然后这个事件就结束了。总结:事件的订阅分两个阶段:首先是传入的参数(即委托)的实例化,相当于委托的实例化,调用该委托的构造函数(一个对象引用,一个IntPtr类型的回调方法的引用),其次就是委托链(也即多播委托)的构建过程,第一次订阅是用一个null和传入的委托的Combine,此时直接返回传入的委托地址,如果第二次订阅就会构造一个新的委托对象,_invocationLis

19、t字段被初始化为一个委托对象数组,引用两个委托地址,最后返回这个新建的对象地址,以后依此类推。接下来就是事件的触发阶段了,通过鼠标单击或动态用代码去实现,其本质只有一个步骤即委托的调用,如果只有一个委托,直接调用Invoke方法,如果有多个委托,即发现_invocationList不为null,会循环调用数组里的所有元素,每个元素的实现即为只有一个委托时调用的Invoke方法。简而言之,即事件分为两个阶段一个是委托的实例化(对应事件订阅),一个是委托的调用(对应事件触发)。加On是命名规范。通常C#自定义事件有下面的几个步骤: 1、声明一个delegate: (用于事件的类型的定义) 如:1.

20、 public delegate void 事件名称EventHandler(object serder, EventArgs e); /事件名称用你的自己的来代替,随后的EventHandler是C#的建议命名规范,当然如果你不想遵守,可以使用任何字符甚至可以不要。 如果你想自定义事件的参数EventArgs,你可以从这个类派生你自己的事件参数类,然后在delegate的声明中,用你的参数类替换EventArgs 注:要全面了解自定义事件的原理,你需要学习有关delegate的知识。2、在你的类中声明一个事件,并且使用步骤1的delegate作为事件的类型: 1. public event

21、事件名称EventHandler 事件名称; 3、在你的类中需要触发事件的方法中,添加事件触发代码: 1. 事件名称(this, new EventArgs(); 或者: 1. if(事件名称!=null) 2. 事件名称(this, new EventArgs(); /如果使用你自己的事件参数类,你可以用你的参数类事例替换new EventArgs(), 同时在你的参数类中保存你需要传递的数据。 4、C#自定义事件注册: 事件注册和普通的事件注册没有不同,也就是说如果一个外部的对象在你的事件被触发的时候需要作出响应,那么你可以在外部了构造器中(或者适当的地方)对事件进行注册 1. 带有事件的

22、类实例.事件名称+= new 事件名称EventHandler( 事件处理方法名称); 5、编写事件处理方法: 1. public void 事件处理方法名称(object sender, EventArgs e) 2. 3. /添加你的代码 4. 注:如果你在类中处理自己的触发事件,你可以选择C#自定义事件步骤4和5的方式,也就是注册自己,也可以在触发事件代码中直接调用事件处理方法。【编辑推荐】1. C#自定义控件的开发:Pin和Connector 2. 比较C#自定义控件的property(属性)和/attribute(性质) 3. C#组件开发:COM和.NET对象之间的互操作 4. 介

23、绍.NET平台、C#和ASP.NET 5. C# Attributes:定义设计期信息追踪告警事件: 事件绑定:m_BatteryRtMemory.OnOccurWarning1 += new EventHandler(m_BatteryRtMemory_OnOccurWarning1);事件:m_BatteryRtMemory.OnOccurWarning1 事件定义: public event EventHandler OnOccurWarning1;委托:EventHandler 委托定义:public delegate void EventHandler(object sender,

24、TEventArgs e);响应事件方法:m_BatteryRtMemory_OnOccurWarning1 响应事件方法定义: void m_BatteryRtMemory_OnOccurWarning1(object sender, ReceiveWarningEvent e) if (e.ReceiveXEventList = null | e.ReceiveXEventList.Count 0) OnOccurWarning1(this, warningEvent1); 也就是说:运行过事件绑定多后OnOccurWarning1 就不为空。当UpdateData被调用的时候,只要Rec

25、eiveXEventList.Count的大小大于0,那么就会响应事件,就好像点击了一个按钮一样。通过委托找到绑定的方法,执行:m_BatteryRtMemory_OnOccurWarning1(),这个方法做了两件事情,、在主界面的告警框里写入记录(有多少告警数量就写入多少条),还写了次日志文件。整个事件完成后继续执行告警类型2等等。但是为什么要提供几种类型的告警信息响应事件呢?其实一个事件也可以完成,但是鉴于告警类型种类很多,如果写在同一个方法里面就会使得方法很臃肿,不便于管理和阅读(可读性和可维护性都比较差)。关于委托的继承问题:EventHandler其中: public class

26、ReceiveWarningEvent : ReceiveWorkStepEvent public class ReceiveWorkStepEvent : EventArgs追踪实时内存库化成结束事件: 事件绑定: m_BatteryRtMemory.OnHcFinished += new EventHandler(m_BatteryRtMemory_OnHcFinished_PH);/鹏?辉?使?用?通过配置文件来开启是否执行这个事件。 事件定义: public event EventHandler OnHcFinished;定义在主界面里面。 委托定义:public delegate v

27、oid EventHandler(object sender, TEventArgs e);继承自:EventArgs,新增了自己的属性和构造函数。 触发(直接线程里面调用的):if (OnHcFinished != null) OnHcFinished(this, new HcFinishedEvent(rtData.CabinetNo, rtData.SideNo, rtData.UnitNo,stepFlowId);响应函数:private void m_BatteryRtMemory_OnHcFinished_PH(object sender, HcFinishedEvent e)主界

28、面的函数。动态生成单选框:绑定了方法:rb_CheckedChanged。跟界面上直接存在着单选框也有点区别。实际上是一样的,表现形式不一样而已。RadioButton rb = new RadioButton(); rb.Parent = panelCabinet; rb.Name = info.cabinet_no.ToString(); rb.Text = info.cabinet_name; rb.Location = new Point(panelCabinet.Width / m_AllCabinetInfoList.Count * i, 1); rb.Tag = info; rb.AutoSize = true; rb.CheckedChanged += new Ev

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1