Элементы управления Swap в TableLayoutPanel Visual Studio
Мне нужно поменять местами элементы управления в TableLayoutPanel. Они стоят отдельными рядами. Я попробовал предложенный код, но безрезультатно. Есть ли другое решение, кроме удаления всех элементов управления и повторного добавления? Ответ может быть в C# или VB.
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim c1 As Control = Me.tlp.GetControlFromPosition(0, 0)
Dim c2 As Control = Me.tlp.GetControlFromPosition(0, 1)
If c1 IsNot Nothing And c2 IsNot Nothing Then
Me.tlp.SetRow(c2, 0)
Me.tlp.SetRow(c1, 1)
End If
End Sub
4 ответов:
Вот код для замены элементов управления в
TableLayoutPanel- у вас есть два варианта.1) замена по ссылке на элементы управления :
Private Sub SwapControls(tlp As TableLayoutPanel, ctl1 As Control, ctl2 As Control) Dim ctl1pos As TableLayoutPanelCellPosition = tlp.GetPositionFromControl(ctl1) tlp.SetCellPosition(ctl1, tlp.GetPositionFromControl(ctl2)) tlp.SetCellPosition(ctl2, ctl1pos) End SubЭто не зависит от того, где расположены элементы управления в
TableLayoutPanel- могут быть разные строки, столбцы или оба.Пример использования:
SwapControls(TableLayoutPanel1, Button1, Button2)2) обмен по индексу столбца / строки :
Private Sub SwapControls(tlp As TableLayoutPanel, pos1 As TableLayoutPanelCellPosition, pos2 As TableLayoutPanelCellPosition) Dim ctl1 As Control = tlp.GetControlFromPosition(pos1.Column, pos1.Row) Dim ctl2 As Control = tlp.GetControlFromPosition(pos2.Column, pos2.Row) SwapControls(tlp, ctl1, ctl2) End SubПример использования:
SwapControls(TableLayoutPanel1, New TableLayoutPanelCellPosition(0, 0), New TableLayoutPanelCellPosition(1, 0))Решения основаны на TableLayoutPanel.SetRow справочная статья по MSDN и некоторые исследования по его представительство декомпилированы. Оба были проверены и признаны работающими.
Если у вас есть фиксированная длина
TableLayoutPanel, Вы можете использоватьFlowLayoutPanel(тогда длина его элементов управления должна быть равна длинеFlowLayoutPanel):Dim c1 As Control = Button1 Dim c2 As Control = CheckBox1 Dim i1 = FlowLayoutPanel1.Controls.IndexOf(c1) Dim i2 = FlowLayoutPanel1.Controls.IndexOf(c2) FlowLayoutPanel1.Controls.SetChildIndex(c1, i2) FlowLayoutPanel1.Controls.SetChildIndex(c2, i1)
То же самое в коде C# : замена / обмен элементами управления в любых положениях 1 и 2:
private void SwapControls(TableLayoutPanel tlp, TableLayoutPanelCellPosition cpos1, TableLayoutPanelCellPosition cpos2) { var ctl1 = tlp.GetControlFromPosition(cpos1.Column, cpos1.Row); var ctl2 = tlp.GetControlFromPosition(cpos2.Column, cpos2.Row); if (ctl1 != null) // position1 can be empty tlp.SetCellPosition(ctl1, cpos2); if (ctl2 != null) // position2 can be empty tlp.SetCellPosition(ctl2, cpos1); }Пример использования:
SwapControls(TableLayoutPanel1, new TableLayoutPanelCellPosition(0, 0), new TableLayoutPanelCellPosition(1, 0))
После целого дня поисков и безуспешных попыток я, наконец, выстрелил в темноте и нашел ответ. Вам нужно использовать SetChildIndex элемента управления в таблице. увидеть ниже...
Примечание: это работает только в том случае, если вы добавляете элементы управления в TableLayoutPanel без индекса строки или столбца.
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load tlp.RowStyles.Clear() For i As Integer = 0 To 4 Dim txt As New TextBox txt.Text = i txt.Name = "txt" & i tlp.Controls.Add(txt) 'this works 'tlp.Controls.Add(txt, 0, i) 'this will not work when button is clicked Next End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click Dim c1 As Control = Me.tlp.GetControlFromPosition(0, 0) Dim c2 As Control = Me.tlp.GetControlFromPosition(0, 1) If c1 IsNot Nothing And c2 IsNot Nothing Then tlp.Controls.SetChildIndex(c1, 1) tlp.Controls.SetChildIndex(c2, 0) End If End Sub
Comments