Vb.net 带参数的地址
我需要以某种方式将groupID(和另一个整数)链接到动态添加的按钮。。有什么想法吗 我能做什么Vb.net 带参数的地址,vb.net,Vb.net,我需要以某种方式将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
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
使用按钮的标记属性
Button1.Tag = someObject
AddressOf获取方法的地址,因此无法向其传递参数。无法使用
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
您可以创建自己的button类并向其中添加任何您想要的内容
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
您可以通过铸造发送者
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
下)中设置
当前项目中定义的控件将自动显示在工具箱中。根据所需参数的复杂性和数量,很少有方法可以做到这一点。 1.使用标记添加复杂结构 2.继承Button类并将值添加为类成员,然后在使用它之前填充它们。这给了你更多的灵活性 如果您使用的是web版本 3.您不能将其添加到标记,但对于简单值,请将其分配给index use.Attributes.add(“名称”)。这会添加到HTML标记中,而不是服务器端。然后可以使用索引访问复杂系统的服务器端结构。
4.如上所述,使用会话存储值并存储对名称属性的会话引用(#3) 您可以使用delegate,它对您的代码非常清楚,如下所示: 定义代理
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
下面的内容对我很有用:
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
我的解决方案:
AddHandler menuItemYear.Items(i).MouseUp, Sub() menu_year(2019)
Private Sub menu_year(ByVal intYear As Integer)
'do something
End Sub
没问题;-)
例如:
Private ComboActionsOnValueChanged As New Dictionary(Of ComboBox, EventHandler)
'somewhere in function
dim del = Sub(theSender, eventArgs)
MsgBox(CType(theSender, ComboBox).Name & " test")
End Sub
ComboActionsOnValueChanged.Add(myCombo, del)
'somewhere else
Dim delTest = ComboActionsOnValueChanged(myCombo)
RemoveHandler myCombo.SelectedValueChanged, delTest
myCombo.DataSource = someDataSource
AddHandler myCombo.SelectedValueChanged, delTest
正如我们所预料的,在这个地方更改数据源后不会触发事件我强烈建议不要使用控件的
标记
属性。这是一场维护噩梦;它的名称和静态类型都不提示被引用的对象。如果您想遵循该路线,更好的替代方法是从Button
派生一个子类MyButton
,并添加一个新的、正确命名和类型化的属性,例如GroupId
,然后使用它,而不是标记
。如果您不打算将属性用于除无限制地访问私有字段之外的任何其他用途,则可以省略getter和setter。我使用一个子项尝试了此操作,如上所示,并在.NET 3.5中收到一个编译错误:“表达式不生成值”。当将我的委托设置为总是返回true的函数时,它起作用了。为什么???@http203这是3.5中lambda表达式语义的实现细节。仅添加了对返回值lambda的支持,Sub
不返回值。在语言的更高版本中,这一点得到了放松。如何稍后调用此事件处理程序的removeholder
?请参阅