Question

J'ai une composante que j'ai créé en C # qui avait déjà été à l'aide du constructeur par défaut, mais maintenant je voudrais qu'il ait sa forme mère créer l'objet (dans le concepteur), en passant une référence à lui-même.

En d'autres termes, au lieu de ce qui suit dans les designer.cs:

        this.componentInstance = new MyControls.MyComponent();

Je voudrais demander au concepteur de formulaire pour créer les éléments suivants:

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

Est-il possible d'atteindre cet objectif (de préférence par un attribut / annotation ou quelque chose)?

Était-ce utile?

La solution

Tu ne peux pas utiliser simplement le propriété de Control.Parent? Certes, il ne sera pas définie dans le constructeur de votre contrôle, mais la façon typique de surmonter qui est en mettant en place ISupportInitialize et de faire le travail dans la EndInit .

Pourquoi avez-vous besoin de la référence Retour au contrôle du fait?

Ici, si vous créez une nouvelle application de la console, et le coller dans ce contenu pour remplacer le contenu de Program.cs, et l'exécuter, vous remarquerez que dans . EndInit , Parent propriété est définie correctement.

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

Autres conseils

Je ne sais pas moyen d'avoir fait le concepteur émette code appelant un constructeur par défaut, mais est ici une idée de la contourner. Mettez votre code d'initialisation dans le constructeur par défaut du formulaire parent et utiliser Form.DesignMode pour voir si vous devez l'exécuter.

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top