Vb.net 如何获得对象的正确处理程序?

Vb.net 如何获得对象的正确处理程序?,vb.net,winforms,handler,Vb.net,Winforms,Handler,我正在制作一个需要动态生成面板的应用程序,每个面板依次生成两个事件,一个用鼠标左键单击,另一个用鼠标右键单击。 右键单击给我带来了麻烦,因为我无法调用在左键单击事件中临时放置的处理程序,但现在我看到它工作了,我想将其传递给ToolStripMenuItem事件,但当它进入事件时,发送方拥有ToolStripMenuItem的所有权,在这种情况下,您需要属性“System.Windows.Forms.Panel”才能处理Panel对象 我不确定我是否做对了,你能支持我,告诉我怎么做吗 附件是我迄今

我正在制作一个需要动态生成面板的应用程序,每个面板依次生成两个事件,一个用鼠标左键单击,另一个用鼠标右键单击。
右键单击给我带来了麻烦,因为我无法调用在左键单击事件中临时放置的处理程序,但现在我看到它工作了,我想将其传递给ToolStripMenuItem事件,但当它进入事件时,发送方拥有ToolStripMenuItem的所有权,在这种情况下,您需要属性“System.Windows.Forms.Panel”才能处理Panel对象

我不确定我是否做对了,你能支持我,告诉我怎么做吗

附件是我迄今为止制定的代码

Public Class Form1

    Dim pb, pbdoors As New Panel

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim pos As Int32 = 20
        Dim contador As Int16 = 1

        For i As Int16 = 1 To 3

            Dim pb As New Panel With
            {
                .Width = 120,
                .Height = 460,
                .Top = 10,
                .Left = 10,
                .Name = "Panel" & contador,
                .Location = New Point(pos, 20)
            }

            AddHandler pb.Click, AddressOf myClickHandler_b

            Me.Panel1.Controls.Add(pb)

            pb.BringToFront()

            pos = pos + 120
            contador = contador + 1
        Next
    End Sub
End Class

Public Sub myClickHandler_b(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim pos As Integer = Val(TextBox38.Text)
    Dim clickedLabel As Panel = DirectCast(sender, Panel)
    clickedLabel.Location = New Point((clickedLabel.Location.X + 120), clickedLabel.Location.Y)

    TextBox38.Text = pos
End Sub

Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
    myClickHandler_b(sender, e)
End Sub

为了识别单击了哪个鼠标按钮,应该使用MouseClick作为事件处理程序。 以开始并处理的代码段是:
“AddHandler pb.MouseClick………”
我希望这可以帮助您:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim pos As Int32 = 20
    Dim contador As Int16 = 1

    For i As Int16 = 1 To 3

        Dim pb As New Panel With
    {
        .Width = 120,
        .Height = 460,
        .Top = 10,
        .Left = 10,
        .Name = "Panel" & contador,
        .Location = New Point(pos, 20)
    }

        AddHandler pb.MouseClick, Sub(senderO As Object, eObj As MouseEventArgs)
                                      If eObj.Button = MouseButtons.Left Then
                                          'Do your tasks here
                                          MsgBox("Left button clicked")
                                      ElseIf eObj.Button = MouseButtons.Right Then

                                          'Do your tasks here
                                          MsgBox("Right button clicked")
                                      End If
                                  End Sub



        Me.Panel1.Controls.Add(pb)

        pb.BringToFront()

        pos = pos + 120
        contador = contador + 1
    Next
End Sub

Winforms仅为两个鼠标按钮提供单个事件(
单击
)。您需要检查(并强制转换,给定该签名)事件参数,以了解右键单击的时间:

Public Sub myClickHandler_b(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim mouseevent As MouseEventArgs = TryCast(e, MouseEventArgs)
    If mouseevent IsNot Nothing AndAlso mouseevent.Button = MouseButtons.Right Then
        RightClick(TryCast(sender, Panel))
        Exit Sub
    End If

    'Left Click

                         'Ugh. Val() is not your friend.
    Dim pos As Integer = Val(TextBox38.Text)
    Dim clickedLabel As Control = DirectCast(sender, Control)
    clickedLabel.Location = New Point((clickedLabel.Location.X + 120), clickedLabel.Location.Y)

    TextBox38.Text = pos
End Sub

Public Sub RightClick(source As Panel)

End Sub
现在是第二部分。在
ToolStripMenuItem1\u Click()
方法中,如果表单上有多个动态面板,该方法如何知道正在使用哪个面板?您需要此代码中的某些内容知道该信息,并将其用于
sender
参数。此外,考虑到左键与右键单击的新处理方式,您还需要仔细考虑这将如何溢出到单击处理程序中

因此
ToolStripMenuItem1\u Click()
应该看起来像这样(但可能不完全如此!):

Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
    myClickHandler_b(pb, Nothing)
End Sub

嗨@Joel Coehoorn,谢谢你的回答。我有一个问题,在这种情况下,当我在ToolStripMenuItem中按向左键时,在“sender”中,有ToolStripMenuItem中的文本,并且MouseEventArgs为空,这是一个问题吗?或者我的问题是什么?将代码附加到其他注释中。谢谢。eventargs可以为空,但发件人不行<代码>myClickHandler()可用于多个不同的面板。因此,在调用该方法之前,必须知道要使用哪个面板。当您有该面板的参考时,您可以将其作为发送者传递。谢谢您的回答,只是一个问题,
Sub
如何执行条件?是否发送处理程序中的操作?或者怎么做?我认为这对他不起作用,因为他希望能够从另一个地方给处理者打电话。可能是
RaiseEvent
,但仍然如此。该子组件称为“匿名”,类似于外部子组件(在各种场景中更有用)。如果需要从不同的位置调用此函数,则应创建一个外部子函数,并使用AdHandler.MouseClick(外部子函数的地址)管理处理程序。之后,如果TypeOf(senderO)为Panel,则应测试发送方参数,否则应测试DoSomethingElse