2

よし。私はいくつかのダイアログを持つアプリを持っています。これらのダイアログには、すべて同じ方法で応答する少数のイベントがあり、すべてにプレゼンターに提供されるいくつかのメソッドがあります。これらはすべて次のようにプッシュされています。

public 抽象クラス BaseFormClass : Form

他のすべての形式は次のとおりです。

パブリック クラス DerivedFormClass : BaseFormClass

私はモデル ビュー プレゼンターのセットアップを行っているので、基本クラスにはいくつかの保護された EventHandler<EventArgs> があり、それぞれに、そのイベントに対して呼び出されるように割り当てられた同様の名前の関数があり、そのセッターが存在します。プレゼンターは、イベントのハンドラーとして使用する独自の関数を割り当てることができます。(言い換えると:)


protected void OnFormBeginClosing(object sender, FormClosingEventArgs e)
{
    if (formClosing == null)
        return;

    formClosing(sender, e);
}

public EventHandler OnFormClose
{
    set
    {
        formClosing = value;
    }
}

protected EventHander<EventArgs> formClosing;

次に、プレゼンターは OnFormClose セッターを使用して独自のハンドラー関数を設定し、必要なクリーンアップなどを処理します。

バックストーリーが邪魔にならないので、主な質問は、親フォームを抽象としてマークするという単純な変更を行うと、子フォームのデザインビューが通常のデザインビューから混乱を吐き出すだけになるのはなぜですか? HTML (まあ、ごちゃごちゃではなく、フォームの HTML 全体のように見える 1 行です...)?

誰かが私が間違っているかもしれないことを提案できますか?

4

1 に答える 1

2

これまでに試したことはありませんが、Visual Studio 2010 で同じことをしようとすると、エラーが発生しますThe designer must create an instance of type 'WinFormsTestApp.FormA' but it cannot because the type is declared as abstract.

ここに画像の説明を入力

これはまさにそれが言っていることを意味していると思います-派生フォームを表示するには、それ自体だけが知っている何らかの理由で、デザイナーは親フォームのインスタンスを作成する必要があり、明らかにそれを行うことはできません. 申し訳ありませんが、おそらく階層を再設計する必要があります。VS の設計者は、フォームとコントロールに使用される継承パターンについて多くの仮定を置いているため、標準のパターンから逸脱すると、これらの問題は非常に一般的になります。

于 2011-04-04T20:18:09.800 に答える