2009-06-01 8 views
1

私は、以前はデフォルトのコンストラクタを使用していたC#で作成したコンポーネントを持っていましたが、親フォームが(デザイナで)オブジェクトを作成し、 。言い換えれば非デフォルトのコンストラクタ

、代わりにdesigner.csに次の:

 this.componentInstance = new MyControls.MyComponent(); 

私は次のことを作成するために、フォームデザイナを指示したいと思います:

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

は、それが達成することが可能ですこれは(できればいくつかの属性/注釈などを介して)ですか?

答えて

2

Control.Parentプロパティを使用できませんか?あなたのコントロールのコンストラクタでは設定されませんが、それを克服する典型的な方法は、ISupportInitializeを実装し、EndInitメソッドで作業を行うことです。

なぜ参照コントロールが必要ですか?

ここで、新しいコンテンツを作成してProgram.csの内容を置き換えて実行すると、.EndInitにはParentプロパティが正しく設定されていることがわかります。

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

ありがとう、私はEndInit()をオーバーライドするとは思っていませんでした(自分のコンポーネントではまだ多くは行っていません)。それは私が探していた答えです。 – Dov

0

実際にデザイナーがデフォルト以外のコンストラクタを呼び出すようにする方法はわかりませんが、これを回避するアイディアがあります。親フォームのデフォルトのコンストラクタの中に初期化コードを置き、Form.DesignModeを使用してそれを実行する必要があるかどうかを確認します。

public class MyParent : Form 
{ 
    object component; 

    MyParent() 
    { 
     if (this.DesignMode) 
     { 
      this.component = new MyComponent(this); 
     } 
    } 
} 
関連する問題