Поменяйте местами три панели - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть три объекта типа панели (A, B и C), которые были динамически созданы в другом элементе управления типа панели.

У меня вопрос, как я могу заменить панель B на позицию? панели A и панели A в положение панели B? Это будет вызвано щелчком по ToolStripMenuItem.

Что я думал, было go через расположение панелей, чтобы узнать, кто существует, и оттуда их обрабатывать, верно?

For Each obj As Control In Panel1.Controls
    MsgBox(obj.Name)
Next

Это код, который я использую для перемещения вправо:

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

    Dim clickedPanel = DirectCast(DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl, Panel)
    clickedPanel.Location = New Point((clickedPanel.Location.X + 120), clickedPanel.Location.Y)

End Sub

Этот код я использую для динамического создания объектов:

Private Sub TileNavItem5_ElementClick(sender As Object, e As NavElementEventArgs) Handles TileNavItem5.ElementClick
    Dim pos As Int32 = cInt(TextBox38.Text)
    Dim poslabel As Int16 = cInt(TextBox42.Text)
    Dim posY As Int16 = 330
    Dim posX As Int16 = 3

    Panel1.AutoScrollPosition = New Point(0, 0)

    Dim pb As New Panel With
    {
        .Width = 120,
        .Height = 460,
        .Top = 10,
        .Left = 10,
        .BorderStyle = BorderStyle.FixedSingle,
        .BackgroundImage = Image.FromFile("C:\example.bmp"),
        .BackgroundImageLayout = ImageLayout.Stretch,
        .ContextMenuStrip = CntxtMnuStrpSection,
        .Name = "Panel" & Val(TextBox37.Text)
    }

    AddHandler pb.Click, AddressOf myClickHandler_b

    Dim labela As New Label With {
        .AutoSize = True,
        .Location = New Point((poslabel), 12),
        .Text = "Section " & CInt(TextBox37.Text),
        .ForeColor = Color.White,
        .BackColor = Color.Transparent,
        .Font = New Font(Me.Font, FontStyle.Bold),
        .Name = "Label" & CInt(TextBox37.Text)
    }
    pb.Location = New Point(0, 0)
    pb.Location = New Point(pos, 20)

    Panel1.Controls.Add(pb)
    pb.Controls.Add(labela)

    For j = 1 To 4

        Dim pbdoors As New Panel With
        {
            .Width = 114,
            .Height = 98,
            .Top = 10,
            .Left = 10,
            .BorderStyle = BorderStyle.FixedSingle,
            .BackgroundImageLayout = ImageLayout.Stretch,
            .ContextMenuStrip = CntxtMnuStrpUnit,
            .Name = "Unit" & Val(TextBox37.Text) & j
        }

        AddHandler pbdoors.Click, AddressOf myClickHandler_doors

        pbdoors.Location = New Point(posX, posY)
        pb.Controls.Add(pbdoors)

        posY = (posY - 100)

    Next

    Panel1.AutoScrollPosition = New Point(Panel1.HorizontalScroll.Maximum, Panel1.VerticalScroll.Maximum)

    TextBox37.Text = CInt(TextBox37.Text) + 1
    TextBox38.Text = Val(TextBox38.Text) + 120
End Sub

1 Ответ

0 голосов
/ 11 февраля 2020

Вам просто нужно найти элементы управления. Обмен - это простая часть.

Найти элементы управления также легко, если вы используете Control.Controls.Find (String, Boolean) . Но вы должны, по крайней мере, знать имя элемента управления.

Сложность возникает здесь

' TextBox37.Text = CInt(TextBox37.Text) + 1 ' implicit conversion from int to string
TextBox37.Text = (CInt(TextBox37.Text) + 1).ToString()

, где вы должны найти элемент управления по имени, и вы ввели целое число в имя. Можете ли вы отследить, сколько раз 1 добавляется к TextBox37.Text?

Если вы можете, вы можете передать его в эту функцию, и будет произведен обмен

Private Sub swap(index1 As Integer, index2 As Integer)
    ' build the panel names
    Dim p1Name = $"Panel{index1}"
    Dim p2Name = $"Panel{index2}"
    ' find the panels
    Dim p1 = DirectCast(Panel1.Controls.Find(p1Name, True).FirstOrDefault(), Panel)
    If p1 Is Nothing Then Throw New ArgumentException("index1")
    Dim p2 = DirectCast(Panel1.Controls.Find(p2Name, True).FirstOrDefault(), Panel)
    If p2 Is Nothing Then Throw New ArgumentException("index2")
    ' swap the panels
    Dim temp = p2.Location
    p2.Location = p1.Location
    p1.Location = temp
End Sub

swap(1, 2) поменяет панель 1 на 2. swap(4, 6) поменяет панель 4 на 6. Этот лог c не входит в ваш вопрос (т.е. сколько раз вызывается TileNavItem5_ElementClick?), Так что вы лучше знаете, как включить это. Я надеюсь, что это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...