デフォルト以外のコンストラクター
-
06-09-2019 - |
質問
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);
}
}
}
所属していません StackOverflow