8

C#アプリケーションにはいくつかのフォームがあります。私はVisual Studio 2010 Betaを使用しますが、.NET 3.5とC#3を使用します。.NET継承された(WinForms)フォーム - VSデザイナーの問題

Shd名前空間にFilteredQueryViewFormという名前の基本フォームがあります。基本的に同じものを実行するため、いくつかの追加があります)。

FilteredQueryViewFormクラスでプライベートからプロテクトに変更したので、派生フォームからアクセスできます。その後、派生したフォームを作成し、基本クラスをFilteredQueryViewFormに設定しました。

派生クラスのデザイナーは、Shd.FilteredQueryViewFormがコンストラクタを持っていないことに不満を抱いていました...それには関係なく、3つのパラメータがあります。私はパラメータが問題になるかもしれないと思ったので、パラメータなしで(public、もちろん)コンストラクタを作成しましたが、それでも動作しません。エラーメッセージは同じです。

"コンストラクターがタイプ 'Shd.FilteredQueryViewForm'が見つかりませんでした。

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

は、これは、Visual Studio 2010のベータ版の問題ですか?それとも私が何か間違ったことをやっている?

答えて

19

あなたのフォームのすべての内のInitializeComponent()メソッドを呼び出し、パラメータなしのコンストラクタが必要になります。 [閉じます

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

+0

ありがとうございました。解決策を再構築することは私が逃したステップでした。 – ShdNx

0

基本クラスを追加したときにForm1.cs [design]が更新されなかったと思います。私も同じ問題がありました。不思議にも、startを押すとプログラムは正常に動作し、実行時にフォームに基本クラスのコンポーネントが表示されますが、編集モードのときは表示されません。

ソリューションエクスプローラでForm1.csをダブルクリックしてください。それは私のために働いた。 Do this

1

これは古いトピックですが、これらのことが再び起こるので、私の貢献は将来的には役立つと思います。

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(); 
     } 
    } 
} 

は空白コンストラクタがありません、それはコンパイルして正常に実行されます。 rutimeでは、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(); 
     } 
    } 
} 

それだけです。

関連する問題