Pergunta

Eu tenho um I componente criado em C #, que tinha sido anteriormente usando o construtor padrão, mas agora eu gostaria de ter o seu formulário pai criar o objeto (no designer), passando uma referência a si mesmo.

Em outras palavras, em vez do seguinte nos designer.cs:

        this.componentInstance = new MyControls.MyComponent();

Gostaria de instruir o designer de formulário para criar o seguinte:

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

É possível alcançar este objectivo (de preferência através de algum atributo / anotação ou algo assim)?

Foi útil?

Solução

Você não pode simplesmente usar o Control.Parent propriedade? Concedido, não será definido no construtor do seu controle, mas a maneira típica de superar isso é através da implementação de ISupportInitialize e fazer o trabalho na EndInit método.

Por que você precisa da volta referência para o controle devido?

Aqui, se você criar um novo aplicativo console, e colar no este conteúdo para substituir o conteúdo da Program.cs, e executá-lo, você vai perceber que em . EndInit , a propriedade Parent está definido corretamente.

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());
        }
    }
}

Outras dicas

Eu não conheço nenhuma maneira de realmente ter o código emitem designer de chamar um construtor não-padrão, mas aqui está uma idéia para contornar o problema. Colocar o seu código de inicialização dentro do construtor padrão do formulário pai eo uso Form.DesignMode para ver se você precisa executá-lo.

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top