如何在VB.NET Windows表单中在运行时更改TableLayoutPanel控件中控件的位置

3

我在Windows Form中有一个TableLayoutPanel控件。现在我在该控件中有4个Panel控件,其中Panel1位于单元格(0,0),Panel2位于单元格(0,1),Panel3位于单元格(1,0),Panel4位于单元格(1,1)。

现在我想将Panel4移动到Panel1的位置并隐藏Panel1。如何操作?

2个回答

3
TableLayoutPanel支持 GetCellPositionSetCellPosition 方法来与子控件位置交互。
以下方法可用于交换两个子控件的位置。
Private Shared Sub SwapPosition(c1 As Control, c2 As Control)
    Dim tlp As TableLayoutPanel = TryCast(c1.Parent, TableLayoutPanel)
    If tlp Is c2.Parent AndAlso tlp IsNot Nothing Then
        Dim posC1 As TableLayoutPanelCellPosition = tlp.GetCellPosition(c1)
        Dim posC2 As TableLayoutPanelCellPosition = tlp.GetCellPosition(c2)

        tlp.SetCellPosition(c2, posC1)
        tlp.SetCellPosition(c1, posC2)
    End If
End Sub

如果要隐藏子控件,可以从TableLayoutPanel的控件集合中删除它,或者调用该控件的Hide方法。


2

如果您在设计时将面板移出 TableLayoutPanel(即将它们移动到表单表面的某个位置),然后在运行时将它们添加到 TLP 控件中,您可以随意添加和删除控件。

这取决于布局面板的每个方格都被占用,因为当您调用 Controls.Add 时,它会停靠到下一个可用空间。

因此,在运行时添加所有面板:

    TableLayoutPanel1.Controls.Add(Panel1)
    TableLayoutPanel1.Controls.Add(Panel2)
    TableLayoutPanel1.Controls.Add(Panel3)
    TableLayoutPanel1.Controls.Add(Panel4)

您可以使用此方法交换控件:
Private Sub SwapControls(aTableLayoutControl As TableLayoutPanel, firstControl As Control, secondControl As Control)
    aTableLayoutControl.Controls.Remove(firstControl)
    aTableLayoutControl.Controls.Remove(secondControl)
    aTableLayoutControl.Controls.Add(secondControl)
    aTableLayoutControl.Controls.Add(firstControl)
End Sub

所以,通过调用这个函数,它应该给你想要的东西:
    SwapControls(TableLayoutPanel1, Panel1, Panel3)
    Panel1.Visible = False

请尝试运行代码。您可以发现它不正确,因为您没有明确指定控件需要出现在哪一行和列。 - Hans Passant
这是可行的代码@HansPassant - 我修改了第一段,现在应该更加清晰明了。 - Matt Wilko
嗨@matt-wilko,它正在工作,但为什么我要将控件保留在TableLayoutPanel之外。我想在设计视图中将控件保留在TableLayoutPanel中。现在在运行时,我想将控件移动到TableLayoutPanel的任何位置。 - Om Prakash Gupta
@OmPrakashGupta - 当我尝试在布局内使用控件时,将它们移除并重新添加后,它们会回到原来的位置,因此这并没有解决问题。 - Matt Wilko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接