Конструктор не по умолчанию
У меня есть компонент, который я создал в 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());
}
}
}
Я не знаю, как на самом деле заставить конструктор испускать код, вызывающий конструктор не по умолчанию, но вот идея обойти это. Поместите свой код инициализации в конструктор по умолчанию родительской формы и используйте Form.DesignMode, чтобы увидеть, нужно ли его выполнять.
public class MyParent : Form
{
object component;
MyParent()
{
if (this.DesignMode)
{
this.component = new MyComponent(this);
}
}
}