Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 带参数的地址_Vb.net - Fatal编程技术网

Vb.net 带参数的地址

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 我不能做但想做的事

我需要以某种方式将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

使用按钮的标记属性

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
?请参阅