2012-06-09 4 views
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.

Мой вопрос, когда созданные текстовые ящики хранятся после нажатия кнопки?

ответ

2

То, что написал @Darren, является правильным, как теоретический вопрос. Я не уверен, что это то, что вы искали, но вот еще информация.

Как и любая локальная переменная, textbox1 привязан к методу, в котором он определен, и «исчезнет», когда Sub вернется. Объект, к которому он относится (экземпляр TextBox, ранее известный как textbox1), все еще существует, и теперь имеет ссылку, хранящуюся в коллекции ControlsGroupBox1.

Понятно, что вы создали это TextBox по какой-либо причине и захотите снова получить его - и вы сможете. Все, что вам нужно сделать, это посмотреть в коллекции GroupBox1.Controls. Предполагая, что при запуске он был пуст, вы можете положиться на то, что все дочерние объекты в нем находятся TextBox элементов управления, которые вы создали.

Теперь, если GroupBox1 содержит другие элементы, кроме ваших динамически созданных элементов управления, у вас есть другие возможности для хранения и извлечения только динамических текстовых полей. Вы можете определить и создать коллекцию на уровне класса (например, в вашей форме) и добавить, например, каждое текстовое поле в эту коллекцию в Button1_Click.

Существуют различные подходы, но, надеюсь, это заставляет вас указывать в правильном направлении.

1

A TextBox - это просто класс .NET, а ваш объект textbox1 похож на любой другой экземпляр класса, он хранится в памяти с помощью Common Language Runtime (CLR). .NET framework заботится об этом для вас (как и любой другой объект). Когда вы звоните:

GroupBox1.Controls.Add(textbox1) framework использует эту ячейку памяти (которая указывает на объект текстового поля) и создает новое текстовое поле из содержимого адреса памяти.

1

Это ужасно двусмысленный вопрос, есть как минимум 5 правильных ответов. Начнем с очевидного ответа:

  • Объект TextBox хранится там, где хранятся все объекты ссылочного типа .NET: на собранной кучей мусора.

не столь очевидные, призванные максимально путаницы:

  • класс TextBox унаследованный от Control, который является производным от компонента, который является производным от MarshalByRefObject. Это позволяет иметь объект, хранящийся в другом AppDomain или процессе. В этом случае ваша программа будет иметь ссылку на прокси. Это необычно кстати.
  • Ваша программа сохраняет ссылку на объект TextBox в GroupBox1.Элементы управления, поэтому вы можете подумать о групповом поле «сохранение» объекта. Winforms использует эту ссылку для автоматического удаления текстового поля при закрытии формы
  • но это не ссылка, которая имеет значение. Вы можете удалить текстовое поле из коллекции Controls, и оно не будет удалено. Winforms поддерживает внутреннюю таблицу, которая отображает оконные дескрипторы для управления объектами. Эта ссылка - это то, что сохраняет, скажем, вашу основную форму, даже если ваша программа не хранит никакой ссылки на нее. И вызывает неприятную утечку при использовании Controls.Remove или Controls.Clear для удаления текстового поля. Управление повторно размещено и «хранится» в невидимом окне с именем «стоянка»
  • Класс TextBox на самом деле является управляемой оболочкой для собственного элемента управления Windows с именем EDIT. Это грандиозный папа всех элементов управления Windows, он существует со времен Windows версии 1. Это похоже на айсберг, 90% под водой и не видно. Windows хранит объекты окна в куче, которая используется всеми процессами, которые выполняются на одном рабочем столе. Свойство Handle является ссылкой на этот собственный объект.