加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 08:03:30 所属栏目:百科 来源:网络整理
导读:项目中要将C#代码( 多个类共用一个事件通道 )转换成VB.NET,觉得有一定的技术含量,以供参考. C#代码示例如下: public delegate void showMsgEventHandler( string msg); class msg { public event showMsgEventHandlershowMsgEvent; public string execMsg( st
项目中要将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
                    

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读