Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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,我刚刚开始自定义类,所以我写了一个按钮条。它继承一个面板,并用传递到my.Add()的字符串中的按钮填充它 我希望它能够自然地抓取ButtonStrip1。单击的处理程序并将其传递给子按钮,然后将其从ButtonStrip1中删除 我还没弄明白,所以我一直在做 Public Class ButtonStrip Inherits Panel Public Property Innermargin As Integer = 5 Dim Offset As Integer =

我刚刚开始自定义类,所以我写了一个按钮条。它继承一个面板,并用传递到my
.Add()
的字符串中的按钮填充它

我希望它能够自然地抓取
ButtonStrip1。单击
的处理程序并将其传递给子按钮,然后将其从ButtonStrip1中删除

我还没弄明白,所以我一直在做

Public Class ButtonStrip
    Inherits Panel
    Public Property Innermargin As Integer = 5
    Dim Offset As Integer = Innermargin
    Dim Buttons = New List(Of ButtonStrip_Button)
    Dim StoredFN As EventHandler

    Public Sub New()
    End Sub

    Function Add(fn As EventHandler, ParamArray ByVal Values As String())
        StoredFN = fn
        For Each V In Values
            Dim B As New ButtonStrip_Button
            Buttons.Add(B)
            Me.Controls.Add(B)
            B.Text = V
            B.Left = Offset + Innermargin
            B.Top = Innermargin

            Offset = B.Left + B.Width
            AddHandler B.Click, fn
        Next
        RemoveHandler Me.Click, fn
        Me.Width = Offset + Innermargin
        Me.Height = Buttons(0).height + Innermargin * 2
    End Function

    Function Add(ParamArray ByVal Values As String())
        If StoredFN Is Nothing Then
            Throw New Exception("First Add() must supply a function")
        End If
        Me.Add(StoredFN, Values)
    End Function
End Class

Public Class ButtonStrip_Button
    Inherits System.Windows.Forms.Button
    Public Sub New()
        AutoSize = True
        AutoSizeMode = AutoSizeMode.GrowAndShrink
    End Sub
End Class
被称为

ButtonStrip1.Add(AddressOf ButtonStrip1_Click,"Button","Texts","Go Here")
我基本上想做的是(psuedo代码)

我试着改变了一些事情,在谷歌上搜索了很多。我也尝试过使用
CallByName(Me,“Click”,CallType.Method)
CallType.Get
,但我得到的错误是
表达式“Click”不是一个过程,而是作为过程调用的目标发生的。
它还为未处理的事件返回完全相同的消息,例如ButtonStrip1没有
MouseDown
事件

我也尝试过使用
MyClass

这里没有看到另一个
.Add()
,它将
StoredFN
添加到
B。单击

例如,此单击事件适用于我的代码

Private Sub ButtonStrip1_Click(sender As Object, e As EventArgs) Handles ButtonStrip1.Click
    msgbox("You clicked " & sender.text & ".")
End Sub

我的建议是这样的:

Public Class ButtonStrip
    Inherits Panel

    Public Event ButtonClick As EventHandler(Of ButtonClickEventArgs)

    Protected Overridable Sub OnButtonClick(e As ButtonClickEventArgs)
        RaiseEvent ButtonClick(Me, e)
    End Sub

    Private Sub Buttons_Click(sender As Object, e As EventArgs)
        OnButtonClick(New ButtonClickEventArgs(DirectCast(sender, Button)))
    End Sub

    Public Sub Add(ParamArray values As String())
        Dim btn As New Button

        AddHandler btn.Click, AddressOf Buttons_Click

        '...
    End Sub

End Class


Public Class ButtonClickEventArgs
    Inherits EventArgs

    Public ReadOnly Property Button As Button

    Public Sub New(button As Button)
        Me.Button = button
    End Sub

End Class

现在不需要传递事件处理程序。单击
按钮
时,
按钮触发
处理该事件,然后引发自己的
按钮单击
事件。无论是
按钮strip
还是
按钮
都不必关心处理该事件的任何方法,因为处理该事件的方式与处理任何其他事件的方式相同。在表单中,然后处理
按钮strip
按钮click
事件,并获取从
e.Button
单击的
按钮。如果您想知道
按钮的位置,而不是
按钮本身的位置,您还可以添加
Index
属性。

我的建议如下:

Public Class ButtonStrip
    Inherits Panel

    Public Event ButtonClick As EventHandler(Of ButtonClickEventArgs)

    Protected Overridable Sub OnButtonClick(e As ButtonClickEventArgs)
        RaiseEvent ButtonClick(Me, e)
    End Sub

    Private Sub Buttons_Click(sender As Object, e As EventArgs)
        OnButtonClick(New ButtonClickEventArgs(DirectCast(sender, Button)))
    End Sub

    Public Sub Add(ParamArray values As String())
        Dim btn As New Button

        AddHandler btn.Click, AddressOf Buttons_Click

        '...
    End Sub

End Class


Public Class ButtonClickEventArgs
    Inherits EventArgs

    Public ReadOnly Property Button As Button

    Public Sub New(button As Button)
        Me.Button = button
    End Sub

End Class

现在不需要传递事件处理程序。单击
按钮
时,
按钮触发
处理该事件,然后引发自己的
按钮单击
事件。无论是
按钮strip
还是
按钮
都不必关心处理该事件的任何方法,因为处理该事件的方式与处理任何其他事件的方式相同。在表单中,然后处理
按钮strip
按钮click
事件,并获取从
e.Button
单击的
按钮。如果您想知道
按钮
的位置,而不是
按钮
本身,也可以添加
索引
属性。

您试图做的是错误的。在
按钮strip的
单击事件处理程序中,您不可能将其中一个子
按钮
控件作为
发送者
。对象的任何事件都应该将该对象传递给其事件处理程序的
发送方。您应该做的是将一个新的
ButtonClicked
事件添加到
ButtonStrip
中,并传递作为
e
参数属性单击的
按钮。如果你想这样做,你应该这样做,那么我将提供一个答案,说明我是如何更新我的问题以包含类的完整代码的。sender.text正在努力为我提供VS 2015中的按钮标签。。。无论如何,我非常感谢你的建议。你想做的是错的。在
按钮strip的
单击事件处理程序中,您不可能将其中一个子
按钮
控件作为
发送者
。对象的任何事件都应该将该对象传递给其事件处理程序的
发送方。您应该做的是将一个新的
ButtonClicked
事件添加到
ButtonStrip
中,并传递作为
e
参数属性单击的
按钮。如果你想这样做,你应该这样做,那么我将提供一个答案,说明我是如何更新我的问题以包含类的完整代码的。sender.text正在努力为我提供VS 2015中的按钮标签。。。无论如何,我非常感谢你的建议。
Public Class ButtonStrip
    Inherits Panel

    Public Event ButtonClick As EventHandler(Of ButtonClickEventArgs)

    Protected Overridable Sub OnButtonClick(e As ButtonClickEventArgs)
        RaiseEvent ButtonClick(Me, e)
    End Sub

    Private Sub Buttons_Click(sender As Object, e As EventArgs)
        OnButtonClick(New ButtonClickEventArgs(DirectCast(sender, Button)))
    End Sub

    Public Sub Add(ParamArray values As String())
        Dim btn As New Button

        AddHandler btn.Click, AddressOf Buttons_Click

        '...
    End Sub

End Class


Public Class ButtonClickEventArgs
    Inherits EventArgs

    Public ReadOnly Property Button As Button

    Public Sub New(button As Button)
        Me.Button = button
    End Sub

End Class