2012-06-09 81 views
1

我在.NET編程中更新。控件在運行時創建後存儲在哪裏?

我需要在運行時創建多個TextBoxies。

我有以下的VB .NET代碼:在運行時點擊Button1的後形成多個文本Boxies

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim textbox1 As New TextBox 
    static Dim shiftDown As Integer 
    static Dim counter As Integer 

    counter += 1 
    shiftDown = shiftDown + 30 
    textbox1.Name = "Textbox" + counter.ToString() 
    textbox1.Size = New Size(170, 10) 
    textbox1.Location = New Point(10, 32 + shiftDown) 
    textbox1.Visible = True 
    GroupBox1.Controls.Add(textbox1) 

End Sub 

此代碼示例創建。

我的問題,點擊按鈕後,創建的文本框存儲在哪裏?

回答

2

@Darren作爲一個理論問題寫的是正確的。不過,我不確定那是不是你想要的,所以這裏有一些更多的信息。

與任何局部變量一樣,textbox1的作用域爲其定義的方法,並在Sub返回時「消失」。它引用的對象(TextBox的實例,以前稱爲textbox1)仍然存在,但現在有一個引用存儲在Controls集合GroupBox1中。

顯然,您創建了TextBox是有原因的,並且希望再次獲得它 - 並且您可以。您只需查看GroupBox1.Controls集合。假設你開始時它是空的,你可以依靠這個事實,那裏的所有子對象都是你創建的TextBox控件。

現在,如果GroupBox1包含除動態創建的控件之外的其他內容,則還可以使用其他選項來存儲和檢索動態文本框。例如,您可以在課程級別(例如在表單上)定義和創建一個集合,並將每個文本框添加到Button1_Click的集合中。

有各種方法,但希望這可以讓你指出正確的方向。

1

A TextBox只是一個.NET類,您的textbox1對象就像其他任何類的實例一樣,它由公共語言運行時(CLR)保存在內存中。 .NET框架爲你處理這個問題(就像任何其他對象一樣)。當你撥打電話:

GroupBox1.Controls.Add(textbox1)該框架使用該內存位置(指向文本框對象)並根據內存地址內容創建一個新的文本框。

1

這是一個非常模棱兩可的問題,至少有5個正確的答案。讓我們從明顯的答案開始:

  • TextBox對象存儲在所有.NET引用類型對象的存儲位置:垃圾回收堆上。

的不那麼明顯的,旨在最大限度地混亂:

  • TextBox類從控制從組件,其自MarshalByRefObject派生派生導出。其中允許將對象存儲在不同的AppDomain或進程中。在這種情況下,您的程序將提供對代理的引用。這是不尋常的順便說一句。
  • 您的程序將對TextBox對象的引用存儲在GroupBox1中。控制集合,所以你可以想象組合框「存儲」對象。 Winforms使用此引用在窗體關閉時自動處理文本框
  • 但這不是重要的參考。您可以從Controls集合中移除文本框,並且不會丟棄它。 Winforms維護一個內部表格,將窗口句柄映射爲控制對象。這個引用就是說,即使你的程序沒有存儲任何對它的引用,你的主窗體仍然存在。並且當您使用Controls.Remove或Controls.Clear刪除文本框時會導致令人討厭的泄漏。該控件被重新託管並「存儲」在一個名爲「停車窗口」的不可見窗口中。TextBox類實際上是一個名爲EDIT的本地Windows控件的託管包裝。這是所有Windows控件的大爸爸,從Windows 1開始就一直存在。這有點像一座冰山,90%在水下,不可見。 Windows將窗口對象存儲在由同一臺桌面上運行的所有進程共享的堆中。 Handle屬性是對該本地對象的「引用」。