Pregunta

Tengo un componente que he creado en C #, que había sido previamente utilizando el constructor por defecto, pero ahora me gustaría tener su forma original a crear el objeto (en el diseñador), pasando una referencia a sí mismo.

En otras palabras, en lugar de los siguientes en los designer.cs:

        this.componentInstance = new MyControls.MyComponent();

Me gustaría dar instrucciones al diseñador de formularios para crear la siguiente:

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

¿Es posible lograr esto (preferiblemente a través de algún atributo / anotación o algo así)?

¿Fue útil?

Solución

¿No te basta con utilizar el Control.Parent propiedad? Por supuesto, no se establecerá en el constructor de su control, pero la forma típica para superar esa es mediante la implementación de ISupportInitialize y hacer el trabajo en el método EndInit .

¿Por qué necesita la referencia de nuevo al control debido?

A continuación, si se crea una nueva aplicación de consola, y pegar en este contenido para reemplazar el contenido de Program.cs, y ejecutarlo, se dará cuenta de que en . EndInit , Padres propiedad se establece correctamente.

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

Otros consejos

No sé de ninguna manera de tener realmente el diseñador emiten código que llama a un constructor no predeterminado, pero aquí está una idea para conseguir alrededor de él. Poner su código de inicialización en el constructor por defecto del formulario principal y utilizar Form.DesignMode para ver si usted necesita para ejecutarlo.

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top