【问题标题】:Handle events for dynamic (run-time) controls - VB.NET处理动态(运行时)控件的事件 - VB.NET
【发布时间】:2010-10-07 06:18:20
【问题描述】:

我有一个在运行时创建并添加到表单的 WebBrowser 控件。

如何将此控件连接到可以在运行时处理其事件的子例程?

【问题讨论】:

    标签: c# vb.net dynamic runtime controls


    【解决方案1】:

    您可以使用 Addhandler 语句来执行这些操作。 您可以像这样在运行时将任何事件处理程序添加到网络浏览器

    AddHandler WebBrowser1.xEvent, AddressOf WebBrowser1EventHandler

    同样,您可以使用 RemoveHandler,它将事件与事件处理程序断开连接,如下所示:

    RemoveHandler WebBrowser1.XEvent, AddressOf WebBrowser1EventHandler

    【讨论】:

      【解决方案2】:

      '我有一个方法可以在某些情况下发现控件并添加处理程序。
      '这是一个简化的例子。
      '是否可以在运行时传入处理程序?

      Private Sub Example(byval ph as Placeholder)
        for each ctrl as control in ph.controls
          if typeof (ctrl) is textbox then
            dim cb as checkbox = ctrl
            AddHandler cb.DataBinding, AddressOf MyHandler
          end if
        next
      end sub
      

      '我想做更多这样的事情......

      Private Sub Example(byval ph as Placeholder, **byref method as delagate**)
        for each ctrl as control in ph.controls
          if typeof (ctrl) is textbox then
            dim cb as checkbox = ctrl
            AddHandler cb.DataBinding, **method**
          end if
        next
      end sub
      

      我遇到的问题是调用该方法。这不起作用:

      Example(myPlaceholder, addressof MyRuntimeHandler)
      

      【讨论】:

        【解决方案3】:

        例子

        AddHandler SharedTimer.Tick, AddressOf SharedTimer_Tick

        【讨论】:

          【解决方案4】:

          使用AddHandler

          例如

          AddHandler Obj.Ev_Event, AddressOf EventHandler
          

          当你想摆脱它时(当你用完它时应该摆脱它)

          RemoveHandler Obj.Ev_Event, AddressOf EventHandler
          

          在你的情况下,你可能有类似的东西

          Dim web as New WebBrowser()
          AddHandler web.DocumentCompleted, AddressOf HandleDocumentCompleted
          

          假设您创建了一个名为 HandleDocumentCompleted 的事件处理程序

          根据您的需要,您也可以在声明您的网络浏览器时使用WithEvents 关键字;见documentation

          【讨论】:

            【解决方案5】:

            使用AddHandler 的替代方法是VB 中的声明性事件语法。要使用它,您声明控件(作为私有成员),使用WithEvents 关键字。然后,Handles 关键字可用于处理相应事件的方法:

            Private WithEvents m_WebBrowser As WebBrowser
            
            Private Sub WebBrowser_Navigate(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs) Handles m_WebBrowser.Navigate
                MsgBox("Hi there")
            End Sub
            
            Private Sub SomeActionThatCreatesTheControl()
                m_WebBrowser = New WebBrowser()
            End Sub
            

            这种方法主要有两个优点:

            • 不需要RemoveHandler
            • 无需手动连接所有事件处理程序:这是自动完成的。

            【讨论】:

              【解决方案6】:

              我通过检查表单设计器生成的代码了解到这一点。从那里复制其中一个示例,如果您环顾四周,您可能会了解有关在运行时设置控件的其他一些有价值的信息。

              在 C# 中,它使用 += 完成,在以函数作为参数的类的事件成员上完成,但我没有方便的 VB.net 来检查自己...抱歉。

              编辑:这是AddHandler,正如 Daniel L 在他的回答中所描述的那样,在msdn 上有详细描述。

              【讨论】:

                【解决方案7】:
                • 您将需要使用 AddHandler 和 RemoveHandler。
                • 如果您通过 AddHandler 手动添加事件,请务必使用 RemoveHandler 将其删除(在适当的位置)。
                • 键入“AddHandler NameOfControl”。将通过智能感知提供可用事件列表。
                • Intellisense、文档(或“错误列表”)也会为您提供事件处理程序的“签名”。
                
                Private Sub WebBrowser1_Navigate(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs)
                
                End Sub
                
                Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
                    RemoveHandler WebBrowser1.Navigated, AddressOf WebBrowser1_Navigate
                End Sub
                
                Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                    AddHandler WebBrowser1.Navigated, AddressOf WebBrowser1_Navigate        
                End Sub
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-10-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-02-04
                  • 2011-01-01
                  相关资源
                  最近更新 更多