AddressOf with parameter

后端 未结 8 614
误落风尘
误落风尘 2021-01-07 23:33

One way or another I need to link groupID (and one other integer) to the button I am dynamically adding.. any ideas?

What I can do;

AddHandler mybutt         


        
相关标签:
8条回答
  • 2021-01-08 00:16

    There is no way to do this with AddressOf itself. What you're looking for is a lambda expression.

    AddHandler myButton.Click, Function(sender, e) PrintMessage(groupId)
    
    Private Sub PrintMessage(ByVal groupID as Integer)
        MessageBox.Show("Dynamic event happened!" & groupID .tostring)
    End Sub
    
    0 讨论(0)
  • 2021-01-08 00:17

    My solution:

    AddHandler menuItemYear.Items(i).MouseUp, Sub() menu_year(2019)
    
    Private Sub menu_year(ByVal intYear As Integer)
       'do something
    End Sub
    
    0 讨论(0)
  • 2021-01-08 00:20

    No problem ;-)

    For example:

    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
    

    as we expect, event won't fire after DataSource change in this place

    0 讨论(0)
  • 2021-01-08 00:26

    The below worked for me:

    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
    
    0 讨论(0)
  • 2021-01-08 00:26

    There are few ways to do that depending of the complexity and number of parameters required. 1. Use Tag for adding a complex structure 2. Inherit the the Button class and add the values as class members then populate them before using it. That gives you a lot more flexibility.

    If you are using web version 3. You cannot add it to Tag, but for simple values assign it to index use .Attributes.Add("name"). This gets added to the HTML tags and not the Server side. You can then use the index to access a server side structure for complex systems. 4. Use sessions to store values and store the session reference to Name attribute as described above (#3).

    0 讨论(0)
  • 2021-01-08 00:30

    You can use delegate which very clear for your code follow as:

    Define a delegate

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

    Custom button class

    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
    
    0 讨论(0)
提交回复
热议问题