我有一个我在C#中创建的组件,之前一直使用默认构造函数,但现在我希望它的父表单创建对象(在设计器中),方法是将引用传递给它自己。
换句话说,而不是designer.cs中的以下内容:
this.componentInstance = new MyControls.MyComponent();
我想指示表单设计者创建以下内容:
this.componentInstance = new MyControls.MyComponent(this);
是否可以实现这一点(最好是通过一些属性/注释或其他东西)?
答案 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);
}
}
}