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