【问题标题】:Using AddressOf Dynamically动态使用 AddressOf
【发布时间】:2014-12-21 11:31:59
【问题描述】:

我正在使用以下代码在运行时向窗体添加按钮:

Private Sub AddNewButton(ByVal btnName As String, ByVal btnText As String)
    Dim myButtons As New VIBlend.WinForms.Controls.vButton

    With myButtons
        .Size = New Size(200, 60)
        .Visible = True
        .Location = New Point(55, 33)
        .Text = btnText
        .Name = btnName
        .Font = New Font("Times New Roman", 12, FontStyle.Bold, GraphicsUnit.Point)
    End With

    AddHandler myButtons.Click, AddressOf btnName & "_Click"

    btnsPanel.Controls.Add(myButtons)

End Sub

代码工作正常,但 Vb.net 不允许我使用变量 AddressOf btnName & "_Click"AddressOf operand must be the name of method 分配 AddressOf 子过程,问题是我不知道要创建哪个按钮以及哪个过程是它会调用,我想使用变量分配 AddressOf 过程 有可能还是我有其他选择?

【问题讨论】:

    标签: vb.net visual-studio-2012 delegates addressof


    【解决方案1】:

    您可以(并且应该)对所有按钮使用相同的事件处理程序。

    AddHandler myButtons.Click, AddressOf btn_Click
    

    你可以通过这种方式在handler中获取名字:

    Private Sub btn_Click(sender As Object, e As EventArgs)
        Dim button = DirectCast(sender, Button)
        Dim name As String = button.Name ' you can also use the Tag property
    End Sub
    

    【讨论】:

      【解决方案2】:

      您也可以使用closure,我总是觉得它非常灵活且易读。

      Imports VIBlend.WinForms.Controls
      
      Private Sub AddNewButton(ByVal btnName As String, ByVal btnText As String)
          Dim myButton = New vButton() With
                          {
                              .Size = New Size(200, 60),
                              .Visible = True,
                              .Location = New Point(55, 33),
                              .Text = btnText,
                              .Name = btnName,
                              .Font = New Font("Times New Roman", 
                                       12, FontStyle.Bold, GraphicsUnit.Point)
                          }
      
          AddHandler myButton.Click, Sub(s, e)
                                         'Do something with Name
                                         MessageBox.Show(myButton.Name)
                                         'Or do something in a instance method
                                         Me.HandleButtonClick(myButton)
                                     End Sub
      
          btnsPanel.Controls.Add(myButton)
      End Sub
      
      Private Sub HandleButtonClick(myButton As vButton)
          ' DO something her with myButton
      End Sub
      

      【讨论】:

        【解决方案3】:

        这个问题虽然陈旧,但缺乏直接而完整的答案。这是一个(动态)按钮的完全动态处理程序:

            Dim SubName As String = dr("SubToRun").ToString
            Dim Pareameter1 As String = dr("Pareameter1").ToString
            Dim Pareameter2 As String = dr("Pareameter2").ToString
            Dim Pareameter3 As Int32 = ValPareameter3
            AddHandler btn.Click, Sub(s, e)
                                      CallByName(Me, SubName, CallType.Method, Pareameter1, Pareameter2, Pareameter1)
                                  End Sub
        

        【讨论】:

          猜你喜欢
          • 2014-01-30
          • 1970-01-01
          • 1970-01-01
          • 2017-10-24
          • 1970-01-01
          • 2015-04-26
          • 1970-01-01
          • 2014-09-19
          相关资源
          最近更新 更多