非默认构造函数

时间:2009-06-01 21:20:19

标签: c# .net visual-studio attributes form-designer

我有一个我在C#中创建的组件,之前一直使用默认构造函数,但现在我希望它的父表单创建对象(在设计器中),方法是将引用传递给它自己。

换句话说,而不是designer.cs中的以下内容:

        this.componentInstance = new MyControls.MyComponent();

我想指示表单设计者创建以下内容:

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

是否可以实现这一点(最好是通过一些属性/注释或其他东西)?

2 个答案:

答案 0 :(得分: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());
        }
    }
}

答案 1 :(得分:0)

我不知道让设计师发出代码调用非默认构造函数的任何方法,但是这里有一个想法来解决它。将初始化代码放在父窗体的默认构造函数中,并使用Form.DesignMode查看是否需要执行它。

public class MyParent : Form
{
    object component;

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