首页 > 解决方案 > 如何才能得到一个对象的正确 Handler?

问题描述

我正在制作一个需要动态生成面板的应用程序,而每个面板又会生成两个事件,一个是左键单击,另一个是鼠标右键单击。
右键单击给我带来了麻烦,因为我无法调用我在左键单击时临时放置的处理程序,但是现在我看到它有效,我想将它传递给 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.netwinformshandler

解决方案


ClickWinforms 只为两个鼠标按钮提供一个事件 ( )。您需要检查(并根据该签名强制转换)事件参数以了解何时右键单击:

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

推荐阅读