【问题标题】:VB.NET For each exception on custom controlsVB.NET 对于自定义控件的每个异常
【发布时间】:2012-01-16 14:26:39
【问题描述】:

在 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 控件匹配的控件?

谢谢

【问题讨论】:

    标签: vb.net exception exception-handling for-loop each


    【解决方案1】:

    据我了解,它应该只通过所有控件 上述表格,只检查那些匹配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
    

    【讨论】:

      【解决方案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 类型。

      【讨论】:

        猜你喜欢
        • 2015-08-28
        • 2010-09-19
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多