循环遍历表单上的多个webbrowser控件?

时间:2013-03-18 21:12:02

标签: vb.net

我理解如何遍历表单上的常规控件。例如,如果我想将表单上所有面板的背景颜色更改为红色,我会这样做......

    Dim IndividualControl As Control
    For Each IndividualControl In Me.Controls
        If (TypeOf IndividualControl Is Panel) Then
            IndividualControl.BackColor = Color.Red
        End If
    Next IndividualControl

但是,让我们说,我不想更改表单上所有面板的属性,而是要更改表单上所有 Web浏览器控件的属性(不要问为什么我在表单上有几个webbrowser控件实例 - 这是一个很长的故事,而且只是项目所需要的:)

因此,例如,如果我想将窗体上的所有WebBrowser控件的“ScriptErrorsSuppressed”属性更改为TRUE,我假设以下代码可以工作,但它没有(它只返回一个错误,指出“ScriptErrorsSuppressed”不是System.Windows.Forms.Controls“。

的成员
    Dim IndividualControl As Control
    For Each IndividualControl In Me.Controls
        If (TypeOf IndividualControl Is WebBrowser) Then
            IndividualControl.ScriptErrorsSuppressed = True
        End If
    Next IndividualControl

所以...任何想法如何解决这个问题?使用VB2010 / Winforms

1 个答案:

答案 0 :(得分:1)

您获得的错误非常有意义,因为您已将IndividualControl声明为Control类型,Control类型的对象没有{{1}成员。

现在,您可能会对自己说,“我知道确实如此,因为我知道ScriptErrorsSuppressedIndividualControl类型的对象”。是的,知道它确实存在,但编译器不知道这一点。 WebBrowser运算符仅检查对象的类型并返回结果。它实际上对象转换为新类型,也不会将对象重新声明对象为新类型的对象。

事实上,大多数时候你使用TypeOf运算符,就是检查一下是否合适。你已经把这部分放在这里了,一旦你知道演员会成功,你就忘了做实际的演员。那么,修复很简单:

TypeOf

<子> 请注意,我们在这里使用了VB.NET Dim IndividualControl As Control For Each IndividualControl In Me.Controls If (TypeOf IndividualControl Is WebBrowser) Then ' We know that IndividualControl is of type WebBrowser now, so we can ' cast it directly to that type and be confident it will succeed. DirectCast(IndividualControl, WebBrowser).ScriptErrorsSuppressed = True End If Next IndividualControl 运算符,这是可以接受的,因为我们已经使用DirectCast运算符验证了强制转换是有效的。您可以使用TypeOf运算符替换DirectCast运算符,然后省略TryCast测试。代码将以基本相同的方式执行;选择最符合您情景的选项。有关VB.NET中强制转换运算符强制转换的更多信息,请参阅this question。特别是TypeOf,我可以提请您注意this informative post,我不能同意这一点。

好吧那么,你可能会说,我知道这是如何工作的,我知道如何修复我的代码。但是 - 当我试图改变面板的背景颜色时,为什么它第一次起作用?我使用完全相同的代码!

确实你做到了。问题是DirectCast属性是BackColor类的属性,它是Control的声明类型。编译器检查IndividualControl是否具有IndividualControl属性,看到它是什么,并接受您的代码。它没有看到它有BackColor属性,因此它拒绝了该代码。换句话说,ScriptErrorsSuppressed属性不是唯一BackColor类型,因此您不需要在那里执行转换。