1

我有一个在 C# 中创建的组件,它以前一直使用默认构造函数,但现在我希望它的父窗体通过传递对自身的引用来创建对象(在设计器中)。

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

        this.componentInstance = new MyControls.MyComponent();

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

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

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

4

2 回答 2

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());
        }
    }
}
于 2009-06-01T21:28:28.313 回答
0

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

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
于 2009-06-01T23:02:59.527 回答