2012-07-18 24 views
2

我創建了一個非常複雜的Windows窗體應用程序。我現在想要做的是,如果點擊不同的按鈕來禁用某些面板,但將其下面的所有其他面板轉移,以便它看起來順序。我對此感到非常難過。我想開發一個函數,它在一個被禁用的面板中傳遞,並在其下面的所有其他面板列表中使用遞歸重新排列所有面板。此功能可以工作,但不考慮如果一個面板的高度大於另一個面板的高度,則會在兩個面板之間留下額外的空間。任何幫助將非常感激。隱藏一個VB.Net後重新排列面板

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/

+0

屏幕截圖可能有助於解釋什麼是怎麼回事。你如何在初始化這個列表的時候先調用這個'whatever'函數? – LarsTech 2012-07-18 17:32:56

+0

只要特定的按鈕被點擊,就會調用'whatever'函數。基於一個按鈕,我知道面板不再顯示了。我比循環,並找到面板下的所有面板不再顯示,我將所有這些面板存儲到一個列表中,而不是我調用任何功能與面板不再顯示,所有其他列表需要轉移的面板。我希望能回答你的問題。 – 2012-07-18 17:51:10

+0

當你說「下」時,你的意思是在z順序下,還是在屏幕上垂直「下」的位置?另外,如果你所做的只是從中獲取一個位置,那麼不要將面板傳遞給你的函數,而是通過一個Point(或者矩形,如果你需要所有的座標)。 – tcarvin 2012-07-18 17:59:36

回答

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


如果使用.NET 2.0,其中LINQ是不可用的,功能會是這個樣子:

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 
+0

嘿,非常感謝你的快速回答。你知道一個最好的方式來找出每個面板之間的間距,就像動態圖像一樣,因爲它們可能不一樣嗎? – 2012-07-18 18:35:18

+0

@尼克我隨意挑選了4個像素作爲我的空間。如果你願意,你可以增加。什麼決定了間距?我想你可以將每個面板的'Margin.Bottom'值設置爲所需的空間量,然後將其更改爲'startPoint.Y + = pnl.Height + pnl.Margin.Bottom'。 – LarsTech 2012-07-18 18:41:36

+0

這工作得很好,但我注意到一個問題。我正在更新的代碼是在Framework 2.0中,Linq將不可用。 :(這讓我很生氣 – 2012-07-18 18:57:24