1

我是 .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 后在运行时在窗体上创建多个文本框。

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

4

3 回答 3

2

@Darren 写的理论上是正确的。不过,我不确定这是否是您要寻找的东西,所以这里有更多信息。

像任何局部变量一样,textbox1它的作用域仅限于定义它的方法,并且会在 Sub 返回时“消失”。但是,它引用的对象( 的实例TextBox,以前称为textbox1)仍然存在,并且现在在 的Controls集合中存储了一个引用GroupBox1

显然,您创建它TextBox是有原因的,并且想要再次获得它 - 您可以。您需要做的就是查看GroupBox1.Controls集合。假设您开始时它是空的,您可以相信其中的所有子对象都是TextBox您创建的控件。

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

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

于 2012-06-09T16:33:25.600 回答
1

这是一个非常模棱两可的问题,至少有5个正确答案。让我们从显而易见的答案开始:

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

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

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

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

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

于 2012-06-09T15:24:37.503 回答