VB.NET Для каждого исключения в пользовательских элементах управления - PullRequest
1 голос
/ 09 декабря 2011

в VB.NET у меня есть 2 пользовательских элемента управления, один - TextBox, а второй - ComboBox.Они имеют пользовательские значения, такие как Bool _IsHidden, и добавляются во время выполнения к форме.

Теперь, в какой-то момент кода, я хочу проверить, установлено ли для _IsHidden значение True или False, и отобразить эту информацию.Поскольку пользователь может редактировать эти значения при создании элемента управления, они не устанавливаются при создании.

Итак, я попробовал:

(все это в формах MDI)

For Each frm as CustomForm in Main.MdiChildren
If frm.MyName = calledBy Then 'this part is just to know which form called the form to create the object
For Each cntrl as CustomTextBox in frm.Controls
'DO Something
Next
End if
Next

Теперь .. если первый элемент управления - это пользовательский ComboBox, он выдает ошибку, поскольку видит, что он не соответствует пользовательскому элементу управления TextBox.

как мне обойти это?Насколько я понимаю, он должен просто пройти через все элементы управления в указанной форме и просто проверить тех, кто соответствует элементу управления CustomTextBox?

Спасибо

Ответы [ 2 ]

4 голосов
/ 09 декабря 2011

For Each x As T In collection не не фильтрует элементы вашей коллекции по типу T.Он пытается преобразовать каждый элемент в collection в T и выдает исключение в случае сбоя.

Таким образом, у вас есть следующие опции:

  1. Выполните проверку самостоятельно, например, используя код, предоставленный RB .

  2. В качестве альтернативы, вы можете отфильтровать свой список first , а затем цикл по пунктам.Здесь LINQ может помочь:

    For Each cntrl In frm.Controls.OfType(Of CustomTextBox)()
        ... ' Do this for all CustomTextBoxes
    Next
    
    For Each cntrl In frm.Controls.OfType(Of CustomComboBox)()
        ... ' Do this for all CustomComboBoxes
    Next
    

    Здесь вам не нужно выражение As CustomTextBox, поскольку frm.Controls.OfType(Of CustomTextBox)() возвращает IEnumerable(Of CustomTextBox), поэтому For Each может вывестисамо по себе, что cntrl должно иметь тип CustomTextBox.

0 голосов
/ 09 декабря 2011

Насколько я понимаю, он должен пройти через все элементы управления на указанной формы и просто отметьте тех, кто соответствует элементу управления CustomTextBox?

Боюсь, это не правильно. Вам нужно будет выполнить эту проверку самостоятельно, например:

For Each cntrl as object in frm.Controls
    If TypeOf cntrl Is CustomTextBox Then
        With CType(cntrl, CustomTextBox)
            .DoSomethingWithControl()
            .DoSomethingElseWithControl()
        End With
    End If 
Next
...