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

问题描述 投票:0回答:2

我正在制作一个需要动态生成面板的应用程序,每个面板依次生成两个事件,一个事件用鼠标左键单击,另一个用鼠标右键单击。右键单击会给我带来麻烦,因为我无法调用在单击鼠标左键时临时放置的处理程序,但是现在我看到它可以工作了,我想将其传递给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
vb.net winforms handler
2个回答
0
投票

为了识别单击了哪个鼠标按钮,应将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

0
投票

Winforms仅为两个鼠标按钮提供一个事件(Click)。您需要检查(并在给定签名的情况下进行强制转换)事件参数以知道何时单击右键:

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_Click()方法中,如果您的表单上有多个动态面板,该方法应该如何知道它正在使用哪个面板?您需要这段代码中的某些信息知道该信息,并将其用于sender参数。此外,考虑到左点击和右点击的新处理方式,您还需要仔细考虑如何将其溢出到点击处理程序中。

所以ToolStripMenuItem1_Click()应该看起来像这样(但可能不完全是!):

Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
    myClickHandler_b(pb, Nothing)
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.