#arrays #vb.net #label #runtime
#массивы #vb.net #метка #время выполнения
Вопрос:
я пытаюсь изменить видимость разных меток во время выполнения после нажатия кнопки
Dim labelsEmpty As New ArrayList
Dim allTxt As New List(Of Control)
For Each txt As TextBox In FindControlRecursive(allTxt, Me, GetType(TextBox))
If txt.Text = "" Then
If txt.Name = "TextBox1" Then
Else
'Dim textBoxName = txt.Name.ToString.Remove("txt").ToLower
labelsEmpty.Add(txt.Name.ToString.Replace("txt", "lblMsg"))
End If
End If
Next
For Each label In labelsEmpty
Dim Label1 As New Label
Label1.Name = label
Label1.Text = "Insert a value"
Label1.Visible = True
Next
Это то, что у меня есть, каждое текстовое поле в моей форме имеет метку, используемую для сообщения пользователю о том, что произошла какая-то ошибка, в этом случае мне нужно получить, какое текстовое поле оставлено пустым, и установить видимость его метки на true (уже скрытую от запуска формы), так что я делаюя просматриваю каждое текстовое поле в своей форме, чтобы увидеть, какое из них пользователь оставил пустым, а затем беру их имя (например: txtAge) и заменяю txt на «lblMsg», а затем вставляю их в массив.
При этом я получаю массив со всеми именами меток, для которых должно быть установлено значение visible = true
Теперь мне нужно установить их видимость и текстовое значение, поэтому я создал цикл для каждого цикла и получил каждую метку в массиве, но код, который я использовал, не работает, я уже проверил, есть ли элементы в массиве, и они есть, любая помощь? Спасибо.
Моя форма: https://i.stack.imgur.com/qrawz.png
Ответ №1:
В последнем цикле вы создаете новые метки и никогда не добавляете их в свою форму. Если у вас уже есть существующие метки в вашей форме, вы хотите ссылаться на них:
For Each label In labelsEmpty
With Controls(label)
.Text = "Insert a value"
.Visible = True
End With
Next
Установка свойства Text может оказаться ненужной, если в ваших метках уже есть необходимый текст.
Если вы хотите создать новые метки, а затем добавить их в свою форму, вам необходимо добавить элемент управления в форму после ее создания:
For Each label In labelsEmpty
Dim Label1 As New Label
With Label1
.Name = label
.Text = "Insert a value"
'.Top = 100
'.Left = 100
.Visible = True
End With
Controls.Add(Label1)
Next
Если вы сделаете это таким образом, вам понадобится какой-то способ установить свойства Top и Left, чтобы метки правильно совпадали с существующими текстовыми полями. Есть несколько способов сделать это, но я оставлю это вам, поскольку я уверен, что мое первое решение отвечает на ваш вопрос.
Комментарии:
1. Первое решение — это то, что я искал, однако оно не работает, поскольку мой arraylist содержит строки, которые являются именами меток, для которых должно быть установлено значение visible, а не сам объект label, что выдает мне эту ошибку: «Переменная объекта или с переменной блока не установлена»
2. Controls() принимает строку в качестве аргумента. Вы уверены, что строка, передаваемая в Controls(), является ТОЧНЫМ именем метки, на которую вы пытаетесь ссылаться?
3. Да, 100% Печать первой строки в массиве с примером с меткой в форме: imgur.com/a/3b9YIhG
4. я изменил arraylist на список строк следующим образом: Dim labelsEmpty Как новый список (строки), и теперь ошибка «$ W0 ничего не значил» при выполнении. Текст = «Вставить значение». Я мог бы просто отбросить эту идею меток
5. Мне говорят перенести это в чат, но у меня недостаточно высокая репутация, чтобы сделать это — итак: вы получаете имена из TabControl. TabPages (2).Элементы управления, но затем пытаетесь найти их с помощью поиска в основной форме. Их там нет! Они находятся на вкладке (2). Ваш второй цикл должен быть с TabControl. Страницы тегов (2).Элементы управления (метка)