現象
Visual Studio 2010 を使用して 2 段階以上継承したフォームをデザイナーで開くと、「値を Null にすることはできません。パラメーター名: objectType」というエラーが発生し、正しく開けない場合があります。
この現象が発生すると、デザイナーには次のようなエラー メッセージが表示されます。本現象は、Visual Basic でのみ発生し、Visual C# 等、他の言語では発生しません。また、Visual Studio 2012 ではこの問題は修正されており、発生しません。
原因
Handles 句によりイベント ハンドラーが宣言されることでデザイナーが正しく機能しないことが原因です。
解決方法
本現象は、基本クラスにあるオブジェクトのイベントを、2 段階以上先の派生クラスでハンドルする際、Handles 句を使用することで発生します。
このため、この Handles 句により宣言されたイベント ハンドラーを AddHandler ステートメントを使用して修正し直すことで正しく開けるようになります。
以下は、このエラーが発生するコードの一例です。この状態でフォームをデザイナーで開くとエラーとなります。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
この記述を以下のように修正すると、正しく開けるようになります。
-
Handles 句の部分を削除します。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) -
フォームのコンストラクタの箇所に AddHandler ステートメントを使用して、ボタンのクリックイベントにイベント ハンドラーを関連付けます。
Public Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
AddHandler Button1.Click, AddressOf Button1_Click
End Sub
補足:
「エラーを無視して続行する」を選択することで、対象のフォームをデザイナーで開くことはできますが、Handles 句で宣言されたイベント ハンドラーが一部削除され機能しなくなる場合がありますので、
上記回避策を実施せず、「エラーを無視して続行する」を選択することは推奨いたしかねます。
詳細
以下は、本現象を再現する手順の一つです。
-
Visual Studio 2010 により [Visual Basic] – [Windows フォーム アプリケーション] を作成します。
-
Form1 に Button コントロールを追加し、Button1 という名前を設定します。
-
プロジェクトの [追加] - [Windows フォーム] から [継承されたフォーム] を選択し、Form1 を継承した Form2 を追加します。
-
プロジェクトの [追加] - [Windows フォーム] から [継承されたフォーム] を選択し、Form2 を継承した Form3 を追加します。
-
Form3.vb に以下のコードを追加します。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub -
Form3 をデザイナーで開くとエラーが発生します。
状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。