Порядок замены в другом элементе управления

#vb.net #panel

#vb.net #панель

Вопрос:

У меня есть панель, которая, в свою очередь, имеет несколько панелей внутри, и они генерируются динамически, что я делаю, так это то, что с помощью события мыши у меня есть меню, которое позволяет мне менять позиции одной панели на другую, то есть, если я хочу поменять местами панелипри использовании PanelB PanelB занимает позицию PanelA, а PanelA — PanelB, пока проблем нет.

Деталь, которая у меня есть, заключается в экспорте информации о коллекции дочерних панелей на лист Excel, они отображаются в том виде, в каком они были созданы, я полагаю, что по его Tabindex, и я хочу, чтобы, если позиция обмена панели с другой, в этом действии также менялся порядок, как они былисоздан так, чтобы в отчете Ecel они отображались в том порядке, в котором они есть.

Я видел панель.Элементы управления.Получаем свойство childIndex и оно выдает мне значение, которое, как я полагаю, является индексом, с которым оно создано, это правильно? Как я могу поменять порядок в том, как они были созданы на другой панели?

Я попробовал следующее.

 Dim clickedPanel = DirectCast(DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl, Panel)
Dim varIndex As Integer = Panel1.Controls.GetChildIndex(clickedPanel)
  

Правильно ли это, чтобы получить индекс в том виде, в каком они были созданы, а затем изменить этот индекс?

Если нет, как я могу внести это изменение?

Заранее благодарю вас.

Я тоже попробовал следующее, но безрезультатно.

 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)
    Dim varIndex As Integer = Panel1.Controls.GetChildIndex(clickedPanel)

    p1Name = clickedPanel.Name
    paParent = clickedPanel.Parent
    indexOrigen = clickedPanel.TabIndex

End Sub


Private Sub ToolStripMenuItem2_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.Click

    Dim clickedPanelDestino = DirectCast(DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl, Panel)

    p2Name = clickedPanelDestino.Name
    pbParent = clickedPanelDestino.Parent
    indexDestino = clickedPanelDestino.TabIndex

    Dim p1 = DirectCast(Panel1.Controls.Find(p1Name, True).FirstOrDefault(), Panel)
    If p1 Is Nothing Then Throw New ArgumentException("indexOrigen")
    Dim p2 = DirectCast(Panel1.Controls.Find(p2Name, True).FirstOrDefault(), Panel)
    If p2 Is Nothing Then Throw New ArgumentException("indexDestino")

    Dim temp = p2.Location
    Dim tempIndex = indexDestino
    p2.Location = p1.Location
    p2.TabIndex = p1.TabIndex
    p1.Location = temp
    p1.TabIndex = tempIndex
    
End Sub
  

Ответ №1:

Через некоторое время это мое решение.

 'Source Unit (Cut Option)
    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)
        varIndexA = Panel1.Controls.GetChildIndex(clickedPanel)

        p1Name = clickedPanel.Name
        paParent = clickedPanel.Parent
        indexOrigen = clickedPanel.TabIndex

    End Sub

'Target Unit (Paste Option)
    Private Sub ToolStripMenuItem2_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.Click

        Dim clickedPanelDestino = DirectCast(DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl, Panel)
        varIndexB = Panel1.Controls.GetChildIndex(clickedPanelDestino)
        p2Name = clickedPanelDestino.Name
        pbParent = clickedPanelDestino.Parent

        Dim p1 = DirectCast(Panel1.Controls.Find(p1Name, True).FirstOrDefault(), Panel)
        If p1 Is Nothing Then Throw New ArgumentException("indexOrigen")
        Dim p2 = DirectCast(Panel1.Controls.Find(p2Name, True).FirstOrDefault(), Panel)
        If p2 Is Nothing Then Throw New ArgumentException("indexDestino")

        Dim temp = p2.Location
        p2.Location = p1.Location
        Panel1.Controls.SetChildIndex(p2, varIndexA)
        p1.Location = temp
        Panel1.Controls.SetChildIndex(p1, varIndexB)

    End Sub
  

Спасибо.