2

非常に複雑なWindowsフォームアプリを作成しました。私が今やろうとしているのは、別のボタンをクリックして一部のパネルを無効にし、その下にある他のすべてのパネルを上に移動して、順番に表示されるようにすることです。私はこれでとても苦労しています。無効になっているパネルとその下にある他のすべてのパネルのリストを渡し、再帰を使用してすべてのパネルを再配置する関数を開発したかったのです。この機能は機能しますが、一方のパネルの高さがもう一方のパネルよりも大きい場合、2つのパネルの間に余分なスペースが残ることは考慮されていません。どんな助けでも大歓迎です。

Public Sub whatever(ByVal panel As Panel, ByVal list As List(Of Panel))
    Dim temppanel As Panel = New Panel()
    For Each item As Panel In list
        temppanel.Location = New Point(temppanel.Location.X, item.Location.Y)
        item.Location = New Point(item.Location.X, panel.Location.Y)
        list.Remove(item)
        whatever(temppanel, list)
        If list.Count = 0 Then
            Exit For
        End If
    Next
End Sub

画像

http://imageshack.us/photo/my-images/268/panelsz.png/

4

1 に答える 1

2

FlowLayoutPanelの方がおそらくこれに適していますが、ここに、あなたが探していると思うことを実行するための一般的な方法があります。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
                          Handles Button1.Click
  ToggelPanel(Panel2)
End Sub

Private Sub ToggelPanel(ByVal whichPanel As Panel)
  Dim startPoint As New Point(10, 10)
  whichPanel.Visible = Not whichPanel.Visible

  For Each pnl As Panel In Me.Controls.OfType(Of Panel)(). _
                           Where(Function(x) x.Visible). _
                           OrderBy(Function(x) x.TabIndex)
    pnl.Location = startPoint
    startPoint.Y += pnl.Height + 4
  Next
End Sub

Meこれらのパネルがにない場合は、親コンテナと交換してくださいMe


LINQが使用できない.net2.0を使用する場合、関数は次のようになります。

Private Shared Function CompareTabIndex(ByVal p1 As Panel, ByVal p2 As Panel) _
                                        As Integer
  Return p1.TabIndex.CompareTo(p2.TabIndex)
End Function

Private Sub ToggelPanel(ByVal whichPanel As Panel)
  Dim startPoint As New Point(10, 10)
  whichPanel.Visible = Not whichPanel.Visible

  Dim panels As New List(Of Panel)
  For i As Integer = 0 To Me.Controls.Count - 1
    If TypeOf Me.Controls(i) Is Panel Then
      If Me.Controls(i).Visible Then
        panels.Add(Me.Controls(i))
      End If
    End If
  Next

  panels.Sort(New Comparison(Of Panel)(AddressOf CompareTabIndex))

  For Each pnl As Panel In panels
    pnl.Location = startPoint
    startPoint.Y += pnl.Height + pnl.Margin.Bottom
  Next
End Sub
于 2012-07-18T18:14:18.910 に答える