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

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

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

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

(все это есть на MDI Forms)

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?

Спасибо


person user1089366    schedule 09.12.2011    source источник


Ответы (2)


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

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

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

  2. В качестве альтернативы вы можете сначала отфильтровать список, а затем пройтись по элементам. Здесь 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.

person Heinzi    schedule 09.12.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
person RB.    schedule 09.12.2011