2014-01-29 69 views
0

位新手,請多多包涵......VB.NET:刪除控件時不再需要

給予一定的背景,我想在的WinForms做一個簡單的應用程序,是這樣的: -

  1. 主窗體(窗口)將在任何時候包含2個面板;用於菜單選項的左側框架和作爲內容窗格的右側框架。

  2. 單擊窗體頂部的4個按鈕之一後,會創建一個面板(左側菜單)並將其置於前面。

  3. 當在菜單中點擊菜單選項時,內容的另一個面板將被創建並顯示在前面。

它似乎按預期工作。 (雖然我覺得它有點像一種暴力方法......)但是,我想到,切換菜單和內容窗格也意味着會創建多個面板副本,並且只會隱藏「由提出的下一個小組審議。

如果我的想法是正確的,那麼理論上就意味着需要越來越多的內存來容納這些不需要的對象,這當然是不可取的。

問題:我在想什麼是準確的?如果是這樣,是否有一個乾淨的方式來刪除不需要的面板?或者,如果任何人都可以暗示我一個乾淨的解決方案來實現概述的界面,我會非常感激。

謝謝!

+0

如果您通過代碼創建面板,則可以在完成後輕鬆「處理」它們。但是如果你再次調用它,你將不得不重新創建它。 –

回答

0

據我瞭解你的問題,你的表單將創建最多2個額外的面板,對吧?

如果這是正確的,爲什麼不從一開始就創建這些面板並使它們不可見,然後 - 單擊右鍵後 - 使它們可見?

這聽起來對我來說更乾淨

+0

基本上我有幾個類定義了內容/菜單等。所以要創建一個面板,我使用例如 > Dim menu As LeftMenu = New LeftMenu() > menu.BringToFront() 所以我每次單擊按鈕時都會創建一個新的對象實例。那是對的嗎? – user3156487

1

這種方法沒有什麼錯。是的,你確實想要清理右側面板的舊內容。這通常是不正確的,使用面板的Controls.Clear()方法是一個非常討厭的資源泄漏。你配置舊的控件。所以,大致如下:

Private Sub DisplaySelection(uc As UserControl) 
    Do While Panel2.Controls.Count > 0 
     Panel2.Controls(0).Dispose() 
    Loop 
    Panel2.Controls.Add(uc) 
End Sub 

這可以任意擴展。例如,一個很好的黑客就是在面板中放置一個表格,這樣可以很容易地設計你的用戶界面。將一個TreeView放置在左側,它旁邊的面板完全停靠。爲每個表單添加節點,將每個節點的Tag屬性設置爲表單的名稱(如「Form2」等)。添加AfterSelect事件處理程序:

Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect 
    DisplaySelection(CStr(e.Node.Tag)) 
End Sub 

的DisplaySelection()方法現在需要動態地創建起的名字Form對象並將其嵌入在面板中。該代碼可能如下所示:

Private Sub DisplaySelection(formName As String) 
    If String.IsNullOrEmpty(formName) Then 
     Throw New InvalidOperationException("You forgot to set the Tag property") 
    End If 
    '' Ignore if that form is already displayed 
    If Panel1.Controls.Count > 0 AndAlso Panel1.Controls(0).GetType().Name = formName Then Return 
    '' Destroy the currently displayed form, if any 
    Do While Panel1.Controls.Count > 0 
     Panel1.Controls(0).Dispose() 
    Loop 
    '' Generate full type name if necessary to get, say, "WindowsApplication.Form2" 
    If Not formName.Contains(".") Then formName = Me.GetType().Namespace + "." + formName 
    Dim frm = CType(System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(formName), Form) 
    If frm Is Nothing Then Throw New InvalidOperationException("Cannot find form " + formName) 
    '' Embed the form in the panel as a child control 
    frm.TopLevel = False 
    frm.FormBorderStyle = FormBorderStyle.None 
    frm.Visible = True 
    frm.Dock = DockStyle.Fill 
    Panel1.Controls.Add(frm) 
End Sub