AddressOf带参数

问题描述 投票:10回答:7

我需要将groupID(和另一个整数)链接到我动态添加的按钮..任何想法?

我可以做什么;

AddHandler mybutton.Click, AddressOf PrintMessage

Private Sub PrintMessage(ByVal sender As System.Object, ByVal e As System.EventArgs)
    MessageBox.Show("Dynamic event happened!")
End Sub

我不能做什么,但想要;

AddHandler mybutton.Click, AddressOf PrintMessage(groupID)

Private Sub PrintMessage(ByVal groupID as Integer)
    MessageBox.Show("Dynamic event happened!" & groupID .tostring)
End Sub
vb.net
7个回答
36
投票

使用AddressOf本身无法做到这一点。你要找的是一个lambda表达式。

AddHandler myButton.Click, Function(sender, e) PrintMessage(groupId)

Private Sub PrintMessage(ByVal groupID as Integer)
    MessageBox.Show("Dynamic event happened!" & groupID .tostring)
End Sub

4
投票

您可以创建自己的按钮类并添加任何想要的按钮类

Public Class MyButton
    Inherits Button

    Private _groupID As Integer
    Public Property GroupID() As Integer
        Get
            Return _groupID
        End Get
        Set(ByVal value As Integer)
            _groupID = value
        End Set
    End Property

    Private _anotherInteger As Integer
    Public Property AnotherInteger() As Integer
        Get
            Return _anotherInteger
        End Get
        Set(ByVal value As Integer)
            _anotherInteger = value
        End Set
    End Property

End Class

自VB 2010以来,你可以简单地写

Public Class MyButton
    Inherits Button

    Public Property GroupID As Integer

    Public Property AnotherInteger As Integer
End Class

您可以通过投射sender来访问该按钮

Private Sub PrintMessage(ByVal sender As Object, ByVal e As EventArgs)
    Dim btn = DirectCast(sender, MyButton)
    MessageBox.Show( _
      String.Format("GroupID = {0}, AnotherInteger = {1}", _
                    btn.GroupID, btn.AnotherInteger))
End Sub

甚至可以在属性窗口中设置这些新属性(在Misc下)。

当前项目中定义的控件自动显示在工具箱中。


2
投票

使用按钮的Tag属性。

Button1.Tag = someObject

AddressOf获取方法的地址,因此您无法将参数传递给它。


1
投票

您可以使用非常清楚代码的委托如下:

定义委托

Public Delegate Sub ControlClickDelegate(ByVal sender As Object, ByVal e As EventArgs)

自定义按钮类

Public Class CustomButton
    Inherits System.Windows.Forms.Button
#Region "property delegate"

    Private controlClickDelegate As ControlClickDelegate

    Public Property ClickHandlerDelegate As ControlClickDelegate
        Get
            Return controlClickDelegate
        End Get
        Set(ByVal Value As ControlClickDelegate)
            controlClickDelegate = Value
        End Set
    End Property

#End Region

    Public Sub RegisterEventHandler()
        AddHandler Me.Click, AddressOf OnClicking
    End Sub

    Private Sub OnClicking(ByVal sender As Object, e As System.EventArgs)
        If (Me.controlClickDelegate IsNot Nothing) Then
            Me.controlClickDelegate(sender, e)
        End If
    End Sub

End Class

的MainForm

Public Class MainForm
    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.

        Me.CusButton1.ClickHandlerDelegate = AddressOf Me.btnClick
        Me.CusButton1.RegisterEventHandler()
    End Sub

    Private Sub btnClick(ByVal sender As Object, ByVal e As EventArgs)
        Me.TextBox1.Text = "Hello world"
        End Sub

End Class

1
投票

我的解决方案

AddHandler menuItemYear.Items(i).MouseUp, Sub() menu_year(2019)

Private Sub menu_year(ByVal intYear As Integer)
   'do something
End Sub

0
投票

根据所需参数的复杂性和数量,有几种方法可以做到这一点。 1.使用Tag添加复杂结构2.继承Button类并将值添加为类成员,然后在使用它之前填充它们。这为您提供了更多的灵活性。

如果您使用的是Web版本3.您无法将其添加到Tag,但对于简单值,请将其分配给索引使用.Attributes.Add(“name”)。这会添加到HTML标记而不是服务器端。然后,您可以使用索引访问复杂系统的服务器端结构。 4.使用会话存储值并将会话引用存储到Name属性,如上所述(#3)。


0
投票

以下对我有用:

Dim bStart = New Button With {.Text = "START"}
AddHandler bStart.Click, Function(sender, e) TriggerProcess(any Long value)


Private Function TriggerProcess(ByVal paramName As Long) As Boolean
 ' any processing logic
 Return True
End Function
© www.soinside.com 2019 - 2024. All rights reserved.