控件在运行时创建后存储在哪里?

时间:2012-06-09 15:17:18

标签: .net vb.net vb.net-2010

我是.NET编程的新手。

我需要在运行时创建多个TextBoxies。

我有以下VB NET代码:

    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

此代码示例在单击Button1后在运行时在Form上创建多个Text Box。

我的问题是在单击按钮后存储创建的文本框的位置?

3 个答案:

答案 0 :(得分:2)

@Darren所写的内容是正确的理论问题。我不确定这是不是你要找的东西,所以这里有更多的信息。

与任何局部变量一样,textbox1的范围限定在它定义的方法中,并在Sub返回时“消失”。它引用的对象(TextBox的实例,以前称为textbox1)仍然存在,现在有一个存储在Controls GroupBox1集合中的引用

显然,你出于某种原因创建了TextBox并希望再次获得它 - 你可以。您需要做的就是查看GroupBox1.Controls集合。假设你开始时它是空的,你可以依赖这样一个事实:那里的所有子对象都是你创建的TextBox控件。

现在,如果GroupBox1包含除动态创建的控件之外的其他内容,则还有其他选项可用于存储和检索动态文本框。您可以在类级别(例如,在表单上)定义和创建集合,并在Button1_Click中将每个文本框添加到该集合中。

有各种各样的方法,但希望这能让你指出正确的方向。

答案 1 :(得分:1)

TextBox只是一个.NET类,你的textbox1对象就像该类的任何其他实例一样,它由公共语言运行时(CLR)保存在内存中。 .NET框架为您处理这个问题(就像任何其他对象一样)。当你打电话:

GroupBox1.Controls.Add(textbox1)框架使用该内存位置(指向文本框对象)并从内存地址内容创建一个新的文本框。

答案 2 :(得分:1)

这是一个非常模糊的问题,至少有5个正确的答案。让我们从明显的答案开始:

  • TextBox对象存储在存储所有.NET引用类型对象的位置:在垃圾回收堆上。

不那么明显的,旨在最大限度地混淆:

  • TextBox类派生自Control,派生自从MarshalByRefObject派生的Component。这允许将对象存储在不同的AppDomain或进程中。在这种情况下,您的程序将引用代理。这是不寻常的顺便说一句。
  • 您的程序在GroupBox1.Controls集合中存储对TextBox对象的引用,因此您可以将组框视为“存储”对象。 Winforms使用此引用在窗体关闭时自动释放文本框
  • 但这不是重要的参考。您可以从Controls集合中删除文本框,但不会将其处理掉。 Winforms维护一个内部表,将窗口句柄映射到控件对象。即使您的程序没有存储对它的任何引用,这个引用也可以保持您的主窗体的活动状态。当您使用Controls.Remove或Controls.Clear删除文本框时,会导致令人讨厌的泄漏。控件被重新托管并“存储”在名为“停车窗口”
  • 的不可见窗口上
  • TextBox类实际上是名为EDIT的本机Windows控件的托管包装器。它是所有Windows控件的祖父,它自Windows 1开始就存在。这有点像冰山一样,90%在水下并且不可见。 Windows将窗口对象存储在堆中,该堆由在同一桌面上运行的所有进程共享。 Handle属性是该本机对象的“引用”。