10

C# アプリケーションにいくつかのフォームがあります。Visual Studio 2010 Beta を使用していますが、.NET 3.5 と C# 3 を使用しています。

Shd 名前空間に FilteredQueryViewForm という基本フォームがあり、それを継承する他のフォームが必要です (基本的に同じことを行いますが、いくつかの追加があるため)。

FilteredQueryViewForm クラスで private から protected に変更したので、派生フォームからアクセスできるようになりました。この後、派生フォームを作成し、基本クラスを FilteredQueryViewForm に設定しました。

派生クラスの設計者は、Shd.FilteredQueryViewForm にコンストラクターがないことに不満を漏らしました... 3 つのパラメーターを持つコンストラクターがあったにもかかわらずです。パラメータが問題になる可能性があると思ったので、パラメータなしで(もちろんパブリック)コンストラクタも作成しましたが、それでも機能しません。エラーメッセージは同じです:

「タイプ 'Shd.FilteredQueryViewForm' のコンストラクターが見つかりません。」

また、派生クラスのデザイナーは読み込まれません。vs2010beta を再起動して、派生フォームを再作成しようとしましたが、何も役に立たないようです。Google は、この問題について私にとって有益な結果をもたらしませんでした。:(

これは Visual Studio 2010 Beta の問題ですか? それとも私は何か間違ったことをしていますか?

4

6 に答える 6

26

すべてのフォームで InitializeComponent() メソッドを呼び出すパラメーターなしのコンストラクターが必要になります。次に、デザイナー ウィンドウを閉じ、ソリューションを再構築して、デザイナーを再度開いてみます。それはうまくいくはずです。ソリューションの再構築は不可欠です。

問題は、Shd.FilteredQueryViewForm から継承するフォームを作成すると、デザイナーは親フォームのコンストラクターを呼び出そうとしますが、コードからではなく、ビルドされたアセンブリからこのフォームをロードすることです。

于 2009-08-01T16:37:38.617 に答える
3

古いトピックであることは承知していますが、これらのことは再び起こるので、私の貢献が将来役立つかもしれないと思います.

Emiswelt 氏は、「すべてのフォームで InitializeComponent() メソッドを呼び出すパラメーターなしのコンストラクターが必要になるでしょう」と述べています。これは実際には必要ありません。派生フォームでカスタムのパラメーター化されたコンストラクターを宣言し、通常は "InitializeComponent" メソッドを呼び出すことができます (カスタム コンストラクターも呼び出します)。重要なことは、コンストラクターが "InitializeComponent" (新しいコントロールの場合) を呼び出し、基本コンストラクターが "InitializeComponent" (継承されたコンポーネントの場合) を呼び出すことです。この状況は実行時に機能しますが、継承されたコントロールは Visual Studio デザイナーには表示されません。設計時にすべてのコントロールを表示するには、基本クラスにパラメーターを持たない単純なコンストラクターのみを追加する必要があります。

たとえば、ベースがボタンと 2 つのラジオ ボタンを含むフォームの場合:

using System.Windows.Forms;
namespace Test
{
    public partial class Form1 : Form
    {
        public Form1(string foo)
        {
            //use "foo" here
            InitializeComponent(); //here button and radios will be initialized
        }
    }
}

設計ツールで確認でき、空のコンストラクター (パラメーターなし) を問題なく回避できます。Form2 は Form1 から継承されます。

namespace Test
{
    public partial class Form2 : Form1
    {
        public Form2(string foo) : base(foo)
        {
            //you can use "foo" here even if it is passed to base class too
            InitializeComponent();
        }
    }
}

空のコンストラクターはなく、正常にコンパイルおよび実行されます。実行時に、Form2 には Form1 と同じコントロール セットが表示されます。しかし... Visual Studio は "InitializeComponent" メソッドがどこにあるかを識別できず、エラーが表示されるため、設計時に表示できません。なんで?呼び出しのチェーンのどこかにパラメーターのないコンストラクターが必要だからです。解決策は、基本クラスを簡単に変更することです。

using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1(string foo):base()
        {
           //use foo here
        }

        public Form1()         //Visual studio designer likes this!
        {
            InitializeComponent();
        }
    }
}

それで全部です。

于 2015-07-30T15:47:01.923 に答える