Проверка тегов каждого TextBox в массиве - PullRequest
0 голосов
/ 20 декабря 2018

Как проверить свойство Tag всех элементов управления TextBox в массиве?
Я хочу что-то вроде этого:

If textBox.Tag And textbox2.Tag And textbox21.Tag And
   textbox22.Tag And textbox23.Tag And textbox24.Tag = "2" Then

Это мой массив TextBoxes:

Dim allTextboxes() As TextBox = {textBox, narNaslov, narPersona, narDani, narPersona2,
                                 kupIme, kupAdresa, kupKontakt, uvBroj, uvDatum, uvIznos,
                                 uvAvans, uvRok, uvNacin, datumTbox} 

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете использовать метод расширения LINQ All , чтобы проверить, имеют ли все элементы управления в массиве одинаковые теги.
Вы можете использовать Any проверить, имеет ли хотя бы один элементов управления в массиве Tag, установленный в указанное значение.

Если у вас есть Option Strict On, чтобы избежать NullReferenceException, поскольку свойство Tag имеет тип Object и может иметь значение null (nothing), вы можетеиспользуйте оператор Is для выполнения проверки:
(элемент управления в массиве тоже может быть nothing в некоторый момент, поэтому мы можем использовать txt?.Tag Is (...). В этом случае, даже когдапо какой-то причине один из текстовых блоков равен nothing, если все остальные текстовые поля имеют одинаковое значение Tag, метод вернет True)

Dim result As Boolean = allTextboxes.All(Function(txt) txt?.Tag Is "2")

Если result равно True, товсе свойство TextBoxes.Tag установлено равным значению, используемому в сравнении.

Это сравнение вернет True, когда:

  • Строка назначается с помощью таблицы свойств в конструкторе
  • В коде с прямым присвоением значения: Control.Tag = "2",
  • В коде с использованием поля или локальной переменной:

    Private TagValue As String = "2" 
    [Control].Tag = TagValue
    
    [Control]?.Tag Is "2"       => True
    [Control]?.Tag Is TagValue  => True 
    

Как отмечает Visual Vincent , Is operator не выполняет сравнение значений;он определяет, ссылаются ли два объекта на один и тот же объект (в этом случае строка создается программно, поэтому сравнение выполняется по ссылке на строку в таблице внутренних пулов ).
Это может бытьжелаемый результат или это может быть не так.

Настройка:

Dim TagValue As String = New String("2"c, 1) 
[Control].Tag = TagValue 

[Control].Tag Is "2"           => False
[Control].Tag Is TagValue      => True

[Control].Tag.Equals("2")      => True
[Control].Tag.Equals(TagValue) => True

Если / когда требуется строгое сравнение значений, предыдущий метод может быть изменен в:

Dim result As Boolean = allTextboxes.All(Function(txt) txt.Tag.Equals("2")

Возвращается Trueв обоих случаях: значение Tag сравнивается, чтобы определить, равны ли два объекта.
Это также будет True, в этом случае, даже если один или несколько элементов управления в массиве расположены / расположеныили null и Option Strict -совместимый.

Однако значение NullReferenceException будет повышено, если для одного из свойств Tag установлено значение nothing.
В этом случае требуется двойная проверка:

Dim result As Boolean = allTextboxes.
    All(Function(txt) txt.Tag IsNot Nothing AndAlso txt.Tag.Equals("2"))
0 голосов
/ 20 декабря 2018

Вы можете использовать LINQ All() -Метод

If allTextBoxes.All(Function(t) t.Tag.ToString = "2") Then
    'All Tags are "2"
End If

Чтобы избежать NullReferenceException, если одно из текстовых полейNothing Вы можете добавить дополнительную проверку:

If allTextBoxes.All(Function(t) t IsNot Nothing AndAlso t.Tag.ToString = "2") Then
    'All Tags are "2"
End If

Или вы можете использовать Нулевой условный оператор (Visual Basic v. 14 или более поздней версии)

If allTextBoxes.All(Function(t) t?.Tag.ToString = "2") Then
    'All Tags are "2"
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...