VB.NET - динамически создаваемые элементы управления и способы управления ими

Если я создам такой элемент управления:

Dim fb As New Label
With fb
    .Name = "newLabel"
    .text = "some text"
    <etc.>
    Me.Controls.Add(fb)
End With

Теперь, если бы я хотел изменить текст на этой метке во время выполнения, я бы обычно сделал:

newLabel.text = "some other text"

К сожалению, Visual Studio не позволяет мне это сделать, поскольку newLabel не определен до времени выполнения.

Итак, мой вопрос: как мне ссылаться на элемент управления, созданный таким образом? (Единственный способ, о котором я могу думать, - это перебрать все элементы управления, пока я не найду тот, который ищу, но мне это кажется немного неэффективным.)

У вас уже есть переменная, которую вы используете: fb. Но это не может быть локальная переменная, ее нужно переместить вверх и сделать членом класса. Или, может быть, вы предпочитаете также находить его динамически: Dim fb = DirectCast (Me.Controls ("newLabel"), Label)

Hans Passant 09.08.2018 22:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 551
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

'newLabel' isn't defined until run time"

Это не совсем так. Вы путаете объект с переменной, используемой для ссылки на объект. Когда вы добавляете элемент управления в форму в конструкторе, VS генерирует код для создания и настройки этого элемента управления. Это очень похоже на код, который вы написали и опубликовали. Вы можете увидеть это в файле кода дизайнера, доступ к которому можно получить, нажав кнопку «Загрузить все файлы» в обозревателе решений. Этот код включает переменную-член, которой назначается созданный объект. Затем вы используете эту переменную-член для ссылки на этот объект в коде.

Если вы создаете элементы управления во время выполнения, вы, как правило, не можете объявить переменную-член для каждой из них, которая будет назначена, потому что вы не знаете, сколько их будет. Если вы знаете, сколько их будет, вероятно, вам следует добавить их во время разработки. Это означает, что у вас есть два варианта:

  1. Объявите одну переменную-член, которая будет ссылаться на коллекцию элементов управления, созданных во время выполнения, а затем обращаться к ней через имя или индекс из нее.

  2. Доступ к ним по имени из коллекции формы или другого контейнерного элемента управления Controls, в который вы должны добавить их, чтобы они отображались.

Вариант 2 требует, чтобы вы указали уникальное имя для каждого элемента управления при его создании. Вариант 1 вообще не требует имени, хотя и не исключает его.

Вариант 1 может выглядеть так:

На уровне класса:

Private labels As New List(Of Label)

Где-то в методе:

For i = 0 To 9
     Dim lbl As New Label

     labels.Add(lbl)
     Controls.Add(lbl)
Next

Потом:

Dim lbl = labels(recordIndex)

Вариант 2 может выглядеть так:

Где-то в методе:

For i = 0 To 9
     Dim lbl As New Label With {.Name = "titleLabel" & i}

     Controls.Add(lbl)
Next

Потом:

Dim lbl = DirectCast(Controls("titleLabel" & recordIndex), Label)

Спасибо большое. Многому учусь.

gCanuck 10.08.2018 14:21

Другие вопросы по теме