1

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

    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

4

1 回答 1

1

您得到的错误非常有意义,因为您已声明IndividualControl为 type Control,并且 type 的对象Control没有ScriptErrorsSuppressed成员。

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

事实上,大多数时候你使用TypeOf操作符,是为了检查一个强制转换是否合适。你已经有了那个部分,一旦你知道演员表会成功,你就忘了做实际的演员表。那么,修复很简单:

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这里使用了 VB.NET 运算符,这是可以接受的,因为我们已经使用该TypeOf运算符验证了强制转换是有效的。您可以将运算符替换为DirectCast运算TryCast符,然后省略TypeOf测试。代码将以基本相同的方式执行;选择对您的方案最有意义的一个。有关 VB.NET 中强制转换运算符的更多信息,请参阅此问题。特别是,我DirectCast可以提请您注意这篇内容丰富的帖子,我非常同意。

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

确实你做到了。问题是该BackColor属性是Control类的属性,它是IndividualControl. 编译器检查它IndividualControl是否有一个BackColor属性,看到它有,并接受你的代码。它没有看到它有一个ScriptErrorsSuppressed属性,所以它拒绝了那个代码。换句话说,该BackColor属性不是类型所独有Panel,因此您不需要在那里执行强制转换。

于 2013-03-18T21:38:45.963 回答