2009-06-01 329 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 2009-06-02 13:46:27

0

我不知道有什麼方法可以讓設計者發出調用非默認構造函數的代碼,但這裏有個想法來解決它。將初始化代碼放入父窗體的默認構造函數內,並使用Form.DesignMode查看是否需要執行它。

public class MyParent : Form 
{ 
    object component; 

    MyParent() 
    { 
     if (this.DesignMode) 
     { 
      this.component = new MyComponent(this); 
     } 
    } 
}