Domanda

Ho un componente che ho creato in C# che in precedenza era stato utilizzando il costruttore di default, ma ora mi piacerebbe avere un suo genitore modulo di creare l'oggetto (in progettazione), passando un riferimento a se stessa.

In altre parole, anziché le seguenti operazioni nella finestra di progettazione.cs:

        this.componentInstance = new MyControls.MyComponent();

Vorrei istruire il form designer per creare il seguente:

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

È possibile raggiungere questo (preferibilmente per mezzo di un certo attributo/annotazione o qualcosa del genere)?

È stato utile?

Soluzione

Non potete utilizzare semplicemente il Control.Parent proprietà? Certo, non sarà impostato nel costruttore del vostro controllo, ma il tipico modo di superare che è mediante l'attuazione di ISupportInitialize e fare il lavoro nel metodo EndInit .

Perché è necessario il riferimento di nuovo al controllo causa?

Qui, se si crea una nuova applicazione console, e si incolla in questo contenuto per sostituire il contenuto di Program.cs, ed eseguirlo, si noterà che in . EndInit , il Parent proprietà è impostata correttamente.

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

Altri suggerimenti

Non conosco nessun modo di avere effettivamente il designer emettono codice di chiamare un costruttore non predefinito, ma ecco un'idea per ottenere intorno ad esso.Inserire il codice di inizializzazione all'interno del costruttore di default del form padre e utilizzare il Modulo.DesignMode per vedere se è necessario eseguirlo.

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top