保留sub属性的地址

时间:2016-07-30 14:25:34

标签: .net vb.net properties delegates

我将使用property来保存click sub的地址,然后将其分配给AddRow()子句中的每个按钮。出现以下错误时出现问题:

错误1

  

方法'公共属性ClickEvent As Button_Click'没有   签名与委托'Delegate Sub EventHandler(发件人)兼容   As Object,e As System.EventArgs)'。

Private Sub Button_Click(sender As Object, e As EventArgs)
    'do somthing
End Sub

Class CustomClass
    Public Fields As New List(Of FieldsDefinition)()

    Class FieldsDefinition
        Public Delegate Sub Button_Click(sender As System.Object, e As System.EventArgs)

        Public __ClickEventValue As Button_Click
        Public Property ClickEvent() As Button_Click
            Get
                Return __ClickEventValue
            End Get

            Set(ByVal value As Button_Click)
                __ClickEventValue = value
            End Set
        End Property
    End Class

    Public Sub AddRow()
        For Each field As FieldsDefinition In Fields
            Dim ctrl As New TextBox
            AddHandler ctrl.Click, AddressOf field.ClickEvent
        Next
    End Sub
End Class

1 个答案:

答案 0 :(得分:0)

2个变化:

  1. 删除AddressOf,因为您不希望处理程序成为ClickEvent属性本身,您希望它是返回的委托。

  2. AddHandler会期望类型为EventHandler的处理程序。因此,请删除Button_Click委托声明,并用EventHandler替换对它的任何引用。

  3. 代码:

    Private Sub Button_Click(sender As Object, e As EventArgs)
        'do somthing
    End Sub
    
    Class CustomClass
        Public Fields As New List(Of FieldsDefinition)()
    
        Class FieldsDefinition
            ' removed Button_Click delegate declaration here
    
            Public __ClickEventValue As EventHandler 'changed Button_Click to EventHandler here
            Public Property ClickEvent() As EventHandler 'changed Button_Click to EventHandler here
                Get
                    Return __ClickEventValue
                End Get
    
                Set(ByVal value As EventHandler) 'changed Button_Click to EventHandler here
                    __ClickEventValue = value
                End Set
            End Property
        End Class
    
        Public Sub AddRow()
            For Each field As FieldsDefinition In Fields
                Dim ctrl As New TextBox
                AddHandler ctrl.Click, field.ClickEvent 'removed AddressOf here
            Next
        End Sub
    End Class