2012年6月9日土曜日

(C#)継承フォームをデザイナで開くとエラー

継承したフォームを Visual Studio のデザイナで開くと『オブジェクト参照がオブジェクト インスタンスに設定されていません。』と、警告になり表示されない問題の対処方法です。

継承元フォームで Load イベントや、表示に係るイベント(Shown, Resize 等)を実装している場合、本来は実行時に発生するイベントが、継承先フォームをデザイナで開く時にも発生します。これは継承したコントロール(カスタムコントロール)でも同様です。

イベント内で this.DesignMode を利用して回避します。
private void Form1_Load(object sender, EventArgs e)
{
    if (this.DesignMode) return;

    //なんらかの処理
}

private void Form1_Resize(object sender, EventArgs e)
{
    if (this.DesignMode) return;

    //なんらかの処理
}
カスタムコントロールを作成した時も同じ症状に遭遇したのですが…忘れてました。へっぽこですね。

これとは別に、継承元フォームにパラメータ付きコンストラクタのみを定義し、デフォルトコンストラクタを削除してしまっている場合や、デフォルトコンストラクタから InitializeComponent() を削除してしまっている場合も『コンストラクタが見つかりません』と警告になり表示されません。
public Form1()
{
    // デフォルトコンストラクタ

    // デフォルトコンストラクタに存在しないとデザイナで警告になる
    InitializeComponent();
}

public Form1(int para1) : this ()
{
    // パラメータ付きコンストラクタ

    // ここに InitializeComponent() を記述し
    // デフォルトコンストラクタに記述しない場合
    // 実行は可能だがデザイナでは警告になる

    // デフォルトコンストラクタに記述し this () で呼ぶか
    // this () を使わず双方のコンストラクタに記述する事でも回避可能

    // 何らかの処理
}


■環境
OS:Microsoft Windows XP Home Edition 日本語 Service Pack 3
IDE:Microsoft Visual Studio 2005 Standard Edition 日本語 Service Pack 1
Framework:Microsoft .NET Framework Version 2.0 SP2