質問

C# で作成したコンポーネントがあり、以前はデフォルトのコンストラクターを使用していましたが、今度はそれ自体への参照を渡すことで、その親フォームに (デザイナーで) オブジェクトを作成させたいと考えています。

つまり、designer.cs では次の代わりに次のようになります。

        this.componentInstance = new MyControls.MyComponent();

フォームデザイナーに次のものを作成するように指示したいと思います。

        this.componentInstance = new MyControls.MyComponent(this);

これを達成することは可能ですか(できれば何らかの属性/アノテーションなどを通じて)。

役に立ちましたか?

解決

単純に使えませんか コントロール.親 財産?確かに、コントロールのコンストラクターには設定されませんが、これを克服する一般的な方法は、 Iサポート初期化 そしてその中で仕事をする EndInit 方法。

なぜ元のコントロールへの参照が必要なのでしょうか?

ここで、新しいコンソール アプリケーションを作成し、この内容を貼り付けて Program.cs の内容を置き換えて実行すると、次のことがわかります。 .EndInit, 、 プロパティが正しく設定されています。

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace ConsoleApplication9
{
    public class Form1 : Form
    {
        private UserControl1 uc1;

        public Form1()
        {
            uc1 = new UserControl1();
            uc1.BeginInit();
            uc1.Location = new Point(8, 8);

            Controls.Add(uc1);

            uc1.EndInit();
        }
    }

    public class UserControl1 : UserControl, ISupportInitialize
    {
        public UserControl1()
        {
            Console.Out.WriteLine("Parent in constructor: " + Parent);
        }

        public void BeginInit()
        {
            Console.Out.WriteLine("Parent in BeginInit: " + Parent);
        }

        public void EndInit()
        {
            Console.Out.WriteLine("Parent in EndInit: " + Parent);
        }
    }

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }
}

他のヒント

私は実際にデザイナーを持っていることのいずれかの方法を知らない、デフォルト以外のコンストラクタを呼び出すコードを放出するが、ここではそれを回避する考えです。親フォームのデフォルトコンストラクタ内で初期化コードを入れて、あなたはそれを実行する必要があるかどうかを確認するためにForm.DesignModeを使用します。

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top