6

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

4 に答える 4

6

コントロールを交換するコードは次のとおりTableLayoutPanelです。2つのオプションがあります。

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))

ソリューションは、MSDNのTableLayoutPanel.SetRowヘルプ記事とその逆コンパイルされた表現に関するいくつかの調査に基づいています。両方ともテストされ、機能していると見なされました。

于 2012-11-10T22:10:59.087 に答える
0

長さが固定されている場合は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)
于 2012-11-11T02:14:54.663 に答える
0

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))
于 2015-09-03T13:00:28.080 に答える
-1

一日探して何も思いつかなかった後、ようやく暗闇の中で写真を撮り、答えを見つけました。テーブル内のコントロールの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
于 2012-11-10T18:35:44.407 に答える