Как получить правильный обработчик объекта? - PullRequest
0 голосов
/ 29 января 2020

Я создаю приложение, которое требует динамической генерации панелей, и в свою очередь каждая панель генерирует два события, одно с левым щелчком мыши, а другое с щелчком правой кнопки мыши. Я не смог вызвать обработчик, который я временно поместил в случае левого щелчка, но теперь, когда я вижу, что он работает, я хочу передать его в событие 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

Ответы [ 2 ]

0 голосов
/ 29 января 2020

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(), если в вашей форме есть несколько динамических c панелей, как этот метод должен знать, с какой панелью он работает? Вам нужно, чтобы что-то в этом коде знало эту информацию и использовало ее для аргумента 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
0 голосов
/ 29 января 2020

Чтобы узнать, какая кнопка мыши нажата, вы должны использовать 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
...