VB.NET 中多个类共用一个事件通道

项目中要将C#代码( 多个类共用一个事件通道)转换成VB.NET,觉得有一定的技术含量,以供参考.
C#代码示例如下:
public delegate void showMsgEventHandler( string msg);
class msg
{
publiceventshowMsgEventHandlershowMsgEvent;
publicstringexecMsg(stringmsg)
{
if(showMsgEvent!=null)
{
showMsgEvent(msg
+","+DateTime.Now.ToString());
}

returnstring.Empty;
}

}


=== 调用 ===
int i = 3 ;
msg[]myMsg;
private void button2_Click( object sender,EventArgse)
{
myMsg
=newmsg[i];
for(intj=0;j<i;j++)
{
myMsg[j]
=newmsg();
myMsg[j].showMsgEvent
+=newshowMsgEventHandler(Form3_showMsgEvent);

}

}


void Form3_showMsgEvent( string msg)
{
MessageBox.Show(msg);
}


private void button3_Click( object sender,EventArgse)
{
for(intj=0;j<i;j++)
{

myMsg[j].execMsg(
"good"+j.ToString());
}

}


转换后的VB.NET代码:
Delegate SubshowMsgEventHandler() SubshowMsgEventHandler(ByValmsgAsString)
ClassmsgClassmsg

PublicnameAsString

EventmsgEventAsshowMsgEventHandler

PublicSubshowMsg()SubshowMsg(ByValmsgAsString)
MsgBox(msg+DateTime.Now.ToString()+","+name)

EndSub


EndClass
=== 调用 ===
Dim i As Integer = 0

Dim myContain As New List(Ofmsg)

Private SubButton2_Click() SubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.Click

Fori=0To3Step1
DimmyMsgAsNewmsg

myMsg.name
="name"&i.ToString()

myContain.Add(myMsg)

AddHandlermyMsg.msgEvent,NewshowMsgEventHandler(AddressOfresponseMsg)
Nexti


EndSub





Private SubresponseMsg() SubresponseMsg(ByValmsgAsString)
MsgBox(msg)
EndSub


Private SubForm1_Load() SubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load

EndSub


Private SubButton3_Click() SubButton3_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton3.Click
Fori=0To3Step1
DimmyMsgAsNewmsg
myMsg
=myContain.Item(i)
myMsg.showMsg(
"good")

Nexti

EndSub


附录:
Visual Basic 语言概念
如何:编写事件处理程序


构造事件处理程序的方法取决于它与事件的关联方式。创建事件处理程序的标准方式是将 Handles 关键字与 WithEvents 关键字一起使用。Visual Basic 提供了第二种方式来处理事件:即 AddHandler 语句。AddHandler 和 RemoveHandler 允许您动态地启动和停止特定事件的事件处理。两种途径都可以使用,但不应该在同一个事件中同时使用 WithEvents 和 AddHandler。

用 WithEvents 处理事件

WithEvents 关键字允许创建可在事件处理程序中与 Handles 子句一同使用的类级或模块级对象变量。

用 WithEvents 和 Handles 子句处理对象

  1. 创建包含事件的简单类。

    Visual Basic 复制代码
    Class Class1
                    Public Event AnEvent(ByVal EventNumber As Integer)
                    End Class
                    
  2. 在即将进行事件处理的类或模块中,用 WithEvents 关键字声明事件源的对象变量,如下面的示例所示:

    Visual Basic 复制代码
    Public WithEvents ClassInst As Class1
                    
  3. 代码编辑器中,从左侧的“类名”下拉列表中选择刚声明的 WithEvents 变量。

  4. 从右侧的“方法名称”下拉列表中选择要处理的事件。代码编辑器用一个 Handles 子句创建空事件处理程序过程。

    注意

    这一步是可选的。只要创建的过程是子例程,有与处理中的事件匹配的正确参数列表,有指定正在处理的事件的 Handles 子句,就可以手动创建事件处理程序过程。

  5. 使用提供的参数给事件处理程序过程添加事件处理代码。以下代码提供了一个示例:

    Visual Basic 复制代码
    Public Sub ClassInst_AnEvent(ByVal EventNumber As Integer) _
                    Handles ClassInst.AnEvent
                    MsgBox("Received event number: " & CStr(EventNumber))
                    End Sub
                    

用 AddHandler 处理事件

可以用 AddHandler 语句动态地将事件与事件处理程序过程连接。

用 AddHandler 处理事件

  1. 创建一个子例程以处理事件,如下面的示例所示:

    Visual Basic 复制代码
    Public Sub EHandler(ByVal EventNumber As Integer)
                    MsgBox("Received event number " & CStr(EventNumber))
                    End Sub
                    
  2. 声明类的对象变量,该变量是您要处理的事件源。不像 WithEvents 变量,此变量可以是过程中的本地变量。例如:

    Visual Basic 复制代码
    Public Sub TestAddHandler()
                    Dim CI As New Class1
                    End Sub
                    
  3. 用 AddHandler 语句指定事件发送器的名称,用 AddressOf 语句提供事件处理程序的名称。例如,将以下代码添加TestAddHandler 子例程的末尾:

    Visual Basic 复制代码
    AddHandler CI.AnEvent,AddressOf EHandler
                    

    只要支持处理中的事件的正确参数,任何过程都能用作事件处理程序。

使用 RemoveHandler 停止处理事件

可以使用 RemoveHandler 语句动态地断开事件与事件处理程序过程之间的连接。

使用 RemoveHandler 停止处理事件

  • 用 RemoveHandler 语句指定事件发送器的名称,用 AddressOf 语句提供事件处理程序的名称。RemoveHandler 语句的语法将会始终与用于启动事件处理的 AddHandler 语句紧密匹配。例如:

    Visual Basic 复制代码
    RemoveHandler CI.AnEvent,AddressOf EHandler
                    

处理自基类继承的事件

派生类(继承某个基类特征的类)能用 HandlesMyBase 语句处理它们的基类所引发的事件。

处理来自基类的事件

  • 通过给事件处理程序过程的声明行添加 Handles MyBase.eventname 语句来声明派生类中的事件处理程序,其中的 eventname 是基类中正在处理的事件的名称。例如:

    Visual Basic 复制代码
    Public Class BaseClass
                    Public Event BaseEvent(ByVal i As Integer)
                    ' Place methods and properties here.
                    End Class
                    Public Class DerivedClass
                    Inherits BaseClass
                    Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent
                    ' Place code to handle events from BaseClass here.
                    End Sub
                    End Class
                    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")