Компоненты vb.net и операторы

очень простой вопрос, как объединить и/или операторы в один и тот же оператор.

c.GetType - getType (TextBox) И foo или bar или baz

Это не работает

For Each c As Control In Me.Controls
    If (c.GetType Is GetType(TextBox)) And ((c.Name <> "txtID") Or (c.Name <> "txtAltEmail")) Then
        'do something
    End If
Next

это работает:

For Each c As Control In Me.Controls
    If (c.GetType Is GetType(TextBox)) And (c.Name <> "txtID") Then
        'do something
    End If
Next

спасибо, я новичок.net!

+1
источник поделиться
2 ответа

Кстати, вы можете использовать LINQ, который улучшает разборчивость:

Dim allTextBoxes = From txt In Me.Controls.OfType(Of TextBox)()
                  Where txt.Name <> "txtID" AndAlso txt.Name <> "txtAltEmail"
For Each txt In allTextBoxes
    ' do something with the TextBox '
Next
  • OfType возвращает только элементы управления данного типа, в этом случае TextBoxes
  • Where фильтрует элементы управления с помощью свойства Name (примечание: разница между And и AndAlso)
  • For Each выполняет итерацию полученного IEnumerable(Of TextBox)
+2
источник

Ваше первое утверждение не имеет смысла с математической точки зрения. Выражение

X <> A or X <> B

всегда будет возвращать true (учитывая, что A <> B, что выполняется в вашем случае с "txtID" <> "txtAltEmail").

(Если X = A, второе предложение будет истинным. Если X = B, первое предложение будет истинным. Если X - что-то еще, оба предложения будут истинными.)

То, что вы, вероятно, хотели написать, было

If (TypeOf c Is TextBox) AndAlso (c.Name <> "txtID") AndAlso (c.Name <> "txtAltEmail") Then

или

If (TypeOf c Is TextBox) AndAlso Not ((c.Name = "txtID") OrElse (c.Name = "txtAltEmail")) Then

который логически эквивалентен.

(Я также взял на себя смелость изменить вашу проверку типа на более элегантный вариант и заменить And/Or их более эффективными аналогами.)

+1
источник

Посмотрите другие вопросы по метке или Задайте вопрос