Вопрос

У меня есть компонент, который я создал на C #, который ранее использовал конструктор по умолчанию, но теперь я хотел бы, чтобы его родительская форма создавала объект (в конструкторе), передавая ссылку на себя.

Другими словами, вместо следующего в designer.cs:

        this.componentInstance = new MyControls.MyComponent();

Я хотел бы поручить дизайнеру форм создать следующее:

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

Возможно ли достичь этого (предпочтительно с помощью какого-нибудь атрибута / аннотации или чего-то еще)?

Это было полезно?

Решение

Разве вы не можете просто использовать Контроль.Родитель собственность?Конечно, он не будет установлен в конструкторе вашего элемента управления, но типичный способ преодолеть это - реализовать ISupportInitialize (Поддержка инициализации) и выполняя работу в Бесконечный способ.

Зачем вам нужна ссылка обратно на элемент управления задолженностью?

Здесь, если вы создадите новое консольное приложение и вставите в него это содержимое, чтобы заменить содержимое Program.cs, и запустите его, вы заметите, что в .Конец, тот самый Родитель свойство задано правильно.

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);
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top