3

System.Windows.Forms.ContextMenuStrip クラスから派生したクラスを作成しました。ユーザー コントロールとしてではなく、コンストラクターと 1 つのイベント ハンドラーを持つ単純な .cs クラスです。

このクラスをツールボックスからデザイナーにドラッグすると、プライベート メンバーといくつかのプロパティが作成されますが、オブジェクトはインスタンス化されません。

したがって、デザイナーが行を生成しないため、実行時に「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」が表示されます。

this.searchGridContextMenu1 = new SearchGridContextMenu();

InitializeComponent 内。

以前はこの行を生成していましたが、実際には Vault リポジトリから戻し続けていますが、デザイナーは再び「それを食べる」だけです。

更新: 同じクラスを使用してユーザー コントロールを作成しようとしましたが、それを行うだけで同じ問題が発生します。

4

5 に答える 5

6

このコメントを別の質問にクロス投稿しましたが、これはここに関連しているため、もう一度です。

ユーザー コントロールが Visual Studio デザイナーに読み込まれない場合は、ここで行う必要があります。これらの命令は vb.net プロジェクト用ですが、c# も同様です。また、これを行う前に、開いているすべてのウィンドウ (または少なくとも、作業中のコントロールのソース ファイルとデザイナー ファイル) を閉じます。

最後に一つだけ。最初にすべきことは、Visual Studio を再起動しても問題が解決しないことを確認することです。そうでない場合は、次の手順を試すことができます。これらの手順は、誤ったユーザー コントロールが Visual Studio のコントロール ライブラリ プロジェクトにあることを前提としています。そうでない場合は、方向を少し調整して機能させることができるはずですが、コントロールが独自のプロジェクトにある場合ははるかに簡単です。

以下をせよ:

  1. コントロール ライブラリをスタートアップ プロジェクトにします。
  2. コントロール ライブラリ プロジェクトのプロパティを開き、[デバッグ] タブをクリックします。
  3. [アクションの開始] で [外部プログラムの開始] オプションをクリックし、Visual Studio 実行可能ファイルを参照します。

注: これは、ソリューションを実行すると、実際にソリューションを実行する代わりに、Visual Studio の別のインスタンスが起動されることを意味します。Visual Studio の最初のインスタンス (INSTANCE_1) は、実行時に Visual Studio の 2 番目のインスタンス (INSTANCE_2) を "ホスト" します。

  1. ソリューションを実行します。INSTANCE_2 が読み込まれます。
  2. INSTANCE_1 に戻ります。
  3. INSTANCE_1 で CTRL-ALT-E を押します。これにより、例外ダイアログ ボックスが開きます。共通言語ランタイム例外の横にある [スロー] 列のチェックボックスをオンにします。

注: これにより、try ブロックでヒットした場合でも、INSTANCE_1 が実行時エラーで確実に中断されます。

  1. INSTANCE_2 に切り替えます。ソリューション エクスプローラーで、誤ったユーザー コントロールをダブルクリックして開きます。

INSTANCE_1 OF Visual Studio は、デザイナーがコントロールを読み込まない原因となったコード行で停止しているはずです。コードを修正します (通常は、オブジェクト プロパティを参照する前に IsNot Nothing をテストすることを意味しますが、他のことを意味する場合もあります)。

また、INSTANCE_1 のエラーで中断するのではなく、コントロールが INSTANCE_2 に読み込まれることがあります。その場合は、デバッグを停止してください... INSTANCE_2 を閉じます。INSTANCE_1 を保存して再起動すると、多くの場合、問題が解消されます。

教訓はこれです。ユーザー コントロールは、デザイナーに読み込むために、すべてのオブジェクトとそのメンバーを読み込み/参照できる必要があります。そのため、他のコンテナーに配置されるユーザー コントロールについては、通常、オブジェクトを子コントロールにプッシュするのではなく、親に通知するイベントを設計します。

これが、この古い質問に関する将来の参照に役立つことを願っています。

セス

于 2009-06-03T20:25:27.623 に答える
4

私はこれを正しく読みましたか?Visual Studio は、コントロールのインスタンスを構築する行を削除しますか?

あなたのコンストラクタは公開されていますか?ある時点で、コンストラクターのアクセシビリティを public から internal に変更しました-うまく行こうとして、厄介なユーザーがアクセスしてはならないものにアクセスするのを止めました-しかし、その後、あなたが説明したのと同じ効果に苦しみました。コンストラクターを InitializeComponent に戻します。

自分の間違いに気付くのに数か月かかりました... Visual Studio のバグだと思い続けていました。public に戻しましたが問題ありません。

于 2011-07-13T11:03:45.190 に答える
1

コントロールから継承するだけでは不十分です。これは、機能させるために実装しなければならなかった最低限のものです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinForms
{
    class Foo : System.Windows.Forms.ContextMenuStrip
    {
        public Foo()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion
    }
}
于 2009-02-04T23:22:53.353 に答える
1

この問題は、InitializeComponent () が基本コンポーネントおよび継承コンポーネントと交差する場合に発生します。解決策は、コンポーネントのデザイナーのメソッドを呼び出すことです。それ以外の場合は、基本メソッドが呼び出されます。

public Form()
{
    this.InitializeComponent(); 
    // base.InitializeComponent <-- default one is thisone
}
于 2010-02-15T13:00:21.847 に答える