组件事件委托_第1页
组件事件委托_第2页
组件事件委托_第3页
组件事件委托_第4页
组件事件委托_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#自定义控件-事件-委托2009-12-06 来自:网易博客 字体大小:【大中小】 摘要:本文应用实例深入分析C#编程中的组件-事件-委托三者之间的关系。 在组件编程中对事件的理解是十分重要的,C# 中的“事件”是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。与事件联系最为紧密的,个人认为是委托.委托可以将方法引用封装在委托对象内。为了弄清组件-事件-委托三者的关系,本人用实际的例子来谈谈自己的理解。理解C#编程中的组件-事件-委托 首先创建一个Windows控件项目,添加如下控件样板: 当事件触发时,会传递一个EventArgs类型的参数给事件处理方法,为了能传递自定义的信息,我们可以创建一个继承于EventArgs的事件参数类,其定义如下:1. publicclassEventLoginArgs:System.EventArgs 2. 3. publicstringstrUserID; 4. publicstringstrUserName; 5. publicstringstrUserPWD; 6. publicboolbVaild; 7. publicEventLoginArgs(8. stringuserID,stringuserName,stringuserPWD) 9. 10. strUserID=userID; 11. strUserName=userName; 12. strUserPWD=userPWD; 13. 再声明两个委托,它们是对EventLoginArgs和EventArgs对象中的信息的封装,如下:1. publicdelegatevoidUserLoginEventHandler(2. objectsender,EventLoginArgse); 3. publicdelegatevoidCancelEventHandler(4. objectsender,EventArgse); 在组件中为了能让用户自定义某事件的处理方法,所以组件必需提供事件接口.如果只是继承于单个已有的Windows控件,可以重载已知的方 法进行添加自己的处理,也可以声明自定义的事件接口.而若组件中包含多个控件,应该根据实际需要声明事件接口,此处本人就两个按钮的 使用而声明两个自定义的事件接口,如下:1. publiceventUserLoginEventHandlerSubmitLogin; 2. publiceventCancelEventHandlerCancel; 3. protectedvirtualvoidOnSubmitLogin(EventLoginArgse) 4. 5. if(this.SubmitLogin!=null) 6. 7. SubmitLogin(this,e); 8. 9. 10. 11. protectedvirtualvoidOnCancel(EventArgse) 12. 13. if(this.Cancel!=null) 14. 15. Cancel(this,e); 16. 17. 其实SubmitLogin 是UserLoginEventHandler委托的实例,令人费解的是此事件的触发,传递,处理过程如何呢? 在本例中是通过确定按钮来触发submitLogin事件的:1. privatevoidbtnOK_Click(objectsender,System.EventArgse) 2. 3. if(txtID.Text!=&txtName.Text!=&txtPWD.Text!=) 4. 5. intLoginTime+; 6. OnSubmitLogin(newEventLoginArgs(7. txtID.Text,txtName.Text,txtPWD.Text); 8. bLogin=TestUserInDB(newEventLoginArgs(9. txtID.Text,txtName.Text,txtPWD.Text); 10. MessageBox.Show(11. thisisthebtnOK_clickfunction!,12. Incontrol,MessageBoxButtons.OK); 13. if(!bLogin) 14. MessageBox.Show(15. LogininFailed!,LoginError,16. MessageBoxButtons.OK); 17. 18. else19. 20. MessageBox.Show(21. Yourmustinputalltheitems!,LoginInfo,22. MessageBoxButtons.OK); 23. 24. 注意本例中的对话框是为了帮助了解事件的过程,真正有用的是第二个例子。 在btnOK_Click事件响应中,先对进行简单的有效性检查,建议实际工作应作加强完善.intLoginTime变量是尝试登录的次数.TestUserInDB是 通过已知信息在数据库中搜索出有关记录进行判断用户是否合法. 因为组件的测试是通过客户程序的,所以应该创建一个最简单明了的客户 程序.这是一个Windows应用程序,将编译好的组件添加到用户控件栏中,拖出到工作区中,添加SubmitLogin事件的响应程序,如下:1. privatevoiduserControl1_SubmitLogin(2. objectsender,Userlogin.EventLoginArgse) 3. 4. MessageBox.Show(Thisisintestform!+5. userControl1.bLogin+6. nsLogintimesis+userCLoginTime+7. nesstrUserID=+e.strUserID,Test,8. MessageBoxButtons.OK); 9. 此时运行客户程序可得以下结果:1. Thisisintestform! 2. thisistheprocessinDB 3. thisisthebtnOK_clickfunction! 结果表明单击btnOK按钮时执行组件中的OnSubmitLogin(new EventLoginArgs(txtID.Text,txtName.Text,txtPWD.Text),此方法又调用 SubmitLogin(this,e),从而激发SubmitLogin事件,userControl1_SubmitLogin就进行响应,故打印第一行。 跟着是执行TestUserInDB,它打印出第二行。 最后是返回到btnOK_Click中输出最后一行。C#编程中的组件-事件-委托:例子二 注意若btnOK_Click中的OnSubmitLogin和TestUserInDB所在的行调换位置,其结果是不同的.第二个例子中,二者的位置调换,先进行数据库 查询判断,再在SubmitLogin的事件响应userControl1_SubmitLogin中处理结果,下面的是例子二的主要代码:1. publicdelegatevoidUserLoginEventHandler(2. objectsender,EventLoginArgse); 3. publicdelegatevoidCancelEventHandler(4. objectsender,EventArgse); 5. 6. publiceventUserLoginEventHandlerSubmitLogin; 7. publiceventCancelEventHandlerCancel; 8. 9. protectedvirtualvoidOnSubmitLogin(EventLoginArgse) 10. 11. if(this.SubmitLogin!=null) 12. 13. SubmitLogin(this,e); 14. 15. 16. 17. protectedvirtualvoidOnCancel(EventArgse) 18. 19. if(this.Cancel!=null) 20. Cancel(this,e); 21. 22. publicstringServer 23. 24. 25. publicstringDataBase 26. 27. 28. publicstringTableSet 29. 30. 31. publicstringUserForDB 32. 33. 34. publicstringPWDForDB 35. 36. 37. 38. publicboolTestUserInDB(EventLoginArgse) 39. 40. /MessageBox.Show(41. /thisistheprocessforDB!,42. /TestUserInDB,MessageBoxButtons.OK); 43. boolbOK=false; 44. if(this.strDataBase!=null&45. this.strServer!=null&46. this.strUserForDB!=null) 47. 48. if(this.strPWDForDB=null) 49. this.strPWDForDB=; 50. 51. stringstrConnection=server=+this.strServer+52. ;database=+this.strDataBase+;UID=+this.strUserForDB+53. ;PWD=+this.strPWDForDB; 54. stringstrSQL=selectUserID,UserName,UserPWDfrom+55. this.strTableSet+whereUserID=+e.strUserID+56. andUserName=+e.strUserName+57. andUserPWD=+e.strUserPWD+; 58. SqlConnectionconn=newSqlConnection(strConnection); 59. try60. 61. conn.Open(); 62. 63. catch(SqlExceptionex) 64. 65. MessageBox.Show(66. 数据库不能打开!请检查有关参数.,67. Error,MessageBoxButtons.OK); 68. returnfalse; 69. 70. SqlDataAdapterda=newSqlDataAdapter(strSQL,conn); 71. DataSetds=newDataSet(); 72. try73. 74. da.Fill(ds,this.strTableSet); 75. 76. catch(SqlExceptionex) 77. 78. . 79. 80. foreach(DataRowrowinds.Tablesthis.strTableSet.Rows) 81. 82. if(row!=null) 83. 84. bOK=true; 85. 86. 87. 88. . 89. 90. else91. 92. bOK=false; 93. 94. returnbOK; 95. 96. privatevoidbtnOK_Click(objectsender,System.EventArgse) 97. 98. if(txtID.Text!=&txtName.Text!=&txtPWD.Text!=) 99. 100. intLoginTime+; 101. bLogin=TestUserInDB(newEventLoginArgs(102. txtID.Text,txtName.Text,txtPWD.Text); 103. if(!bLogin) 104. MessageBox.Show(105. LogininFailed!,LoginError,106. MessageBoxButtons.OK); 107. else108. OnSubmitLogin(newEventLoginArgs(109. txtID.Text,txtName.Text,txtPWD.Text); 110. 111. else112. 113. MessageBox.Show(114. Yourmustinputalltheitems!,115. LoginInfo,MessageBoxButtons.OK); 116. 117. 118. 119. privatevoidbtnCancel_Click(120. objectsender,System.EventArgse) 121. 122. OnCancel(e); 123. 124. 125. privatevoidUserControl_Load(126. objectsender,System.EventArgse) 127. 128. intLoginTime=0; 129. 130. 131. 132. 133. publicclassEventLoginArgs:System.EventArgs 134. 135. publicstringstrUserID; 136. publicstringstrUserName; 137. publicstringstrUserPWD; 138. publicboolbVaild; 139. publicEventLoginArgs(140. stringuserID,stringuserName,stringuserPWD) 141. 142. strUserID=userID; 143. strUserName=userName; 144. strUserPWD=userPWD; 145. 146. 147. 它的客户程序主要如下:1. privatevoiduserControl1_SubmitLogin(2. objectsender,Userlogin.EventLoginArgse) 3. 4. MessageBox.Show(5. ThisresultisbLogin=+userControl1.bLogin+6. At+userCLoginTime+timesnUserID=+e.strUserID+7. nUserName=+e.strUserName,TestResult,MessageBoxButtons.OK); 8. 9. privatevoidForm1_Load(objectsender,System.EventArgse) 10. 11. userControl1.Server=localhost; 12. userControl1.DataBase=weiwen; 13. userControl1.TableSet=TestUser; 14. userControl1.UserForDB=sa; 15. userControl1.PWDForDB=sa; 16. 17. 以上就对C#编程中的组件-事件-委托做出了一些介绍。读者可以参考学习,也可直接使用此组件,但使用时应当以Microsoft SQL Server 作为后台数据库,所用到的用户表格应有 UserID,UserName,UserPWD三列,同时在客户程序中应对有关参数初始化,SubmitLogin事件返回值是尝试次数intLoginTime和验证是否成功bLogin,可参考扩展例子二。进一步接触C#委托与事件2009-08-26 14:48 ruizhinet网易博客字号:T|T本文通过在控制台下使用C#委托和事件和在窗体中使用C#委托和事件这两部分内容进一步地揭示了C#委托与事件的相关问题,供大家参考。AD:2014WOT全球软件技术峰会北京站 课程视频发布一、在控制台下使用C#委托和事件我们都知道,C#中有“接口”这个概念,所谓的“接口”就是定义一套标准,然后由实现类来具体实现其中的方法,所以说“接口,是一组类的抽象”。同样道理,我们可以将“委托”理解为“方法的抽象”,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。我们知道接口的最大好处就是可以实现多态,同理,“委托”是可以实现方法的多态,当我们想调用某个具体方法的时候,我们不直接调用这个方法,而是去调用这个委托。当然,我们必须在具体方法和委托之间建立某种关联。下面我们来看例子。首先,我们定义一个委托:1. publicdelegatevoidSaySomething(stringname);这跟抽象方法的语法格式很相似,只是多了一个关键字delegate。既然是对方法的一种抽象,那么我们最关注的当然就是方法的返回值以及方法的参数了。所以上面红色的部分就是我们定义出来的一个规矩,如果某个方法想委托我去做事,那么请你遵循我的规矩,就是返回值为void,参数为一个字符串。我们这个委托的含义是,当某个人来了,就向他说点东西。好,既然我们已经定义了这个规矩,下面我们就定义具体的方法了。1. publicvoidSayHello(stringname) 2. 3. Console.WriteLine(Hello,+name+!); 4. 5. 6. 7. publicvoidSayNiceToMeetYou(stringname) 8. 9. Console.WriteLine(Nicetomeetyou,+name+!); 10. 我们这里一共定义了两个方法,一个是向某人说Hello,另一个是向某人说Nice to meet you。我们看到,这里定义的两个方法的返回值和参数跟我们前面定义的“委托”是一致的。接下来,我们来看事件。1. publiceventSaySomethingcome;我们定义了一个事件,这个事件是“有人来了”,注意定义的时候我们使用event关键字,除此之外,我们还加上了前面定义的“委托”的名字。这个意思是说,我这个事件只会跟“SaySomething”打交道,并且,当我这个事件发生的时候,我会通知关注我的这些“委托”(再由这些“委托”去调用具体的方法)。我们来定义一个测试方法:1. publicvoidtest() 2. SaySomethingsayhello=newSaySomething(SayHello); 3. SaySomethingsaynice=newSaySomething(SayNiceToMeetYou); 4. come+=sayhello; 5. come+=saynice; 6. come(张三); 7. 方法体中的前面两行是用来实例化委托,注意我们用到了new关键字,就好像实例化一个类一样,然后传入一个参数,但这个参数不是string类型、也不是int类型,而是一个方法名。再下面两行就是将委托加到事件上,意思是说,如果你这个事件发生了,就告诉我一声。可以通过“+=”来将n个委托实例加到某个事件上,一旦这个事件发生,所有的这些委托实例都会得到通知。最后一行是触发一个事件,注意我们是直接用一个事件名,然后跟一个参数,这又跟“委托”中定义的那个规矩一致(即,要有一个string类型的参数)。最后运行一下1. staticvoidMain(stringargs) 2. 3. Programprogram=newProgram(); 4. program.test(); 5. Console.Read(); 6. 我们回过头来再看一下“事件”的定义:1. publiceventSaySomethingcome;这里已经指出了“委托”的名字,所以,我们可以直接将方法加到事件上,而省略“委托”的实例化过程,因此上面的test()方法可以简单写为:1. publicvoidtest() 2. come+=SayHello; 3. come+=SayNiceToMeetYou; 4. come(张三); 5. 二、在窗体中使用C#委托和事件上面的例子并不能体现委托和事件的优点,其实,委托和事件在C#中使用非常广泛,例如,当我们点击某个“按钮”的时候,就会有一个“Click”事件触发,而这个事件会通知“委托”,在C#窗体应用程序中,“委托”的名字比较规范,统一使用“EventHandler”,它的具体格式是“void EventHandler(object sender, EventArgs e);”。相信大家都写过下面这样子的HelloWorld程序:当点击按钮的时候弹出一个对话框。我们怎样实现的呢?你肯定会说,我们在设计窗口双击按钮,就会自动为我们生成类似如下的方法:1. privatevoidbutton1_Click(objectsender,EventArgse) 2. 3. MessageBox.Show(我被点击了!); 4. 其实,这里用到的就是事件和委托,这里的button1_Click就是符合EventHandler委托规矩的一个具体的方法,即返回值为void,参数分别是一个object和EventArgs。我们可以在Form1.Designer.cs中看到如下代码:1. this.button1.Click+=newSystem.EventHandler(this.button1_Click);可以看到,这里有一个Click事件,然后将一个委托实例附加到这个事件上,跟我们前面讲的控制台应用程序中的用法是完全一样的。那这个Click事件是怎么触发的呢?对于这些系统类的事件,并不用我们管。当然,我们也可以定义自己的事件和委托,例如我定义一个事件,这个事件就是输出对象的名字。我们这里定义了一个ShowName委托和一个btnclick事件。并且,在button1_Click()方法中触发这个btnclick事件。最后的结果是,当我们点击按钮的时候,首先弹出一个“我被点击了!”的对话框,然

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论