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 ブラウザーコントロールのプロパティを変更したいとします(フォーム上に Web ブラウザー コントロールのインスタンスが複数ある理由は聞かないでください)。 -- これは長い話ですが、単にプロジェクトが必要とするものです :)

したがって、たとえば、フォーム上のすべての WebBrowser コントロールの「ScriptErrorsSuppressed」プロパティを TRUE に変更したい場合、次のコードが機能すると想定しましたが、機能しません (「ScriptErrorsSuppressed is not a. 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

IndividualControltype であると宣言し、 typeControlのオブジェクトにはメンバーControlがないため、取得しているエラーは完全に理にかなっています。ScriptErrorsSuppressed

さて、あなたは自分自身にこう言っているかもしれませIndividualControlWebBrowser。はい、そうであることはわかっていますが、コンパイラはそれを知りません。オペレーターはオブジェクトの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

ここで VB.NETDirectCast演算子を使用したことに注意してください。これは、演算子を使用してキャストが有効であることを既に確認しているため、許容されますTypeOfDirectCast演算子を演算子に置き換えて、テストTryCastを省略できます。TypeOfコードは本質的に同じように実行されます。シナリオに最も適したものを選択してください。VB.NET でのキャスト演算子のキャストの詳細については、この質問を参照してください。特に、この有益な投稿DirectCastに注意を向けてもよろしいですか。これには同意できませんでした。

さて、あなたはおそらく、これがどのように機能するかを理解し、コードを修正する方法を知っていると言っているでしょう. しかし、パネルの背景色を変更しようとしたときに、なぜ最初に機能したのですか? 私はまったく同じコードを使用しました!

確かにそうでした。問題はBackColor、プロパティがControlクラスのプロパティであり、宣言された型であるということIndividualControlです。IndividualControlコンパイラは、プロパティがあることを確認し、BackColorプロパティがあることを確認して、コードを受け入れます。プロパティがあることがわからないScriptErrorsSuppressedため、そのコードを拒否しました。別の言い方をすれば、BackColorプロパティは型に固有のものではないPanelため、そこでキャストを実行する必要はありませんでした。

于 2013-03-18T21:38:45.963 に答える