5

これはおかしな悪夢で、必死に助けが必要です。私は助けを求めてどこでも探しましたが、恒久的な修正として何も機能していません。

私が開発したカスタム コントロールがいくつかあります。ボタン、ユーザーコントロールなどを拡張するコントロール。私はVS2010が常にランダムに、リズムや私が識別できる理由なしに、それを使用するカスタムコントロールを使用するコントロールのデザインビューを開こうとすると決定するという問題があります(編集:「それ」は Windows フォーム ジェネレーターです) .designer.cs ファイルからカスタム コントロールのコンストラクターを呼び出す行を完全に削除する必要があるため、デザイン ビューを表示する能力が完全に失われます。アプリケーションは引き続きビルドされ、完全に正常に実行されます。

以下をテストし、問題として除外しました。

  1. パブリック コンストラクター - 非パブリック (内部など) コンストラクターがあると、このような問題が発生する可能性があります。100 回チェックしました。すべてのカスタム コントロールにパブリック コンストラクターがあります。

  2. 空のコンストラクター - public であることに加えて、空である必要があります。

  3. コンストラクターで失敗する可能性のあるものは何も呼び出さない - カスタム コントロールのすべてのコンストラクターを空に減らしました

     Name() { }
    呼び出します。そこには運がありません。

  4. 名前空間 - 明らかに別の名前空間にいると問題が発生する可能性がありますか? 私は同じものにいて、ファイルは同じプロジェクトにあります。

  5. プロジェクトをアンロードします。VSを閉じます。.suo IntelliSense ファイルを削除します。obj ファイルを削除します。VSを開きます。プロジェクトをリロードします。プロジェクトを再構築します。まだ運がありません。

これはめちゃくちゃイライラします。カスタムコントロールを使用して捨てる準備ができており、それを避けるために手ですべてのコントロールを個別にスキンします。誰でもこれを引き起こす原因について何か知っていますか?

4

1 に答える 1

3

まず、問題...「.designer.cs」コードに何かを入れています...しないでください。それがマイクロソフトのサンドボックスです。WinForms フォームとビジュアル コントロールが作成されるとき、それらは通常、次のような「セット」にあります。

MyForm.cs   (place for YOUR code)
   MyForm.designer.cs  (Microsoft's sandbox area for designer stuff)
   MyForm.resx   (Resource file -- if used, specific to this form).

そうは言っても、通常の「デザイナー」で WinForm を開き、「コードの表示」を右クリックすると、MyForm.cs コード セットが表示されます。そのことに注意してください

PARTIAL PUBLIC CLASS MyForm : Window
{
   public MyForm()
   {
      InitializeComponent();
   }
}

「MyForm.Designer.cs」と「MyForm.cs」は基本的にチームで動作します。マイクロソフトのものに加えて、あなたのもの。何をしようとしているかに応じて、フォーム全体の THIS コンストラクターにフックすることができます。何らかのデータ接続を準備する必要がある場合は、データのクエリ、リストの作成、またはフォームで使用されるものは何でも。多くの方法で行うことができます (前または後)。

   public MyForm()
   {
      DoYourStuff();
      InitializeComponent();
      // or DoYourStuff here after designer controls are all initialized.
   }

   private void DoYourStuff()
   {  put it here }

フォーム全体がロードされた後で、ユーザーへの最終的なプレゼンテーションの前に何かをしたい場合があります。場合によっては、LOADED がフォーム全体 (フォームとそのすべてのコントロール) に対して完了した後に、実際にフックを配置しました。だから私は次のようなことをしました:

public MyForm()
{

   Load += MyAfterInitializeComponents;
   InitializeComponent();
}


private void MyAfterInitializeComponents(object sender, EventArgs e)
{  
   DoYourStuff(); 
}

あなたがやろうとしている特定の何かがある場合は、ウィンドウベースのコードのサンドボックス内に統合するのに役立つサンプルコードかもしれません.

于 2012-04-30T11:12:54.390 に答える