我需要将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
使用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
您可以创建自己的按钮类并添加任何想要的按钮类
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
下)。
当前项目中定义的控件自动显示在工具箱中。
使用按钮的Tag属性。
Button1.Tag = someObject
AddressOf获取方法的地址,因此您无法将参数传递给它。
您可以使用非常清楚代码的委托如下:
定义委托
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
我的解决方案
AddHandler menuItemYear.Items(i).MouseUp, Sub() menu_year(2019)
Private Sub menu_year(ByVal intYear As Integer)
'do something
End Sub
根据所需参数的复杂性和数量,有几种方法可以做到这一点。 1.使用Tag添加复杂结构2.继承Button类并将值添加为类成员,然后在使用它之前填充它们。这为您提供了更多的灵活性。
如果您使用的是Web版本3.您无法将其添加到Tag,但对于简单值,请将其分配给索引使用.Attributes.Add(“name”)。这会添加到HTML标记而不是服务器端。然后,您可以使用索引访问复杂系统的服务器端结构。 4.使用会话存储值并将会话引用存储到Name属性,如上所述(#3)。
以下对我有用:
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