Frage

Ich habe eine Komponente I in C # erstellt, die den Standard-Konstruktor zuvor gewesen war, aber jetzt möchte ich es ihre Mutterform zu haben, das Objekt (im Designer) erstellen, indem Sie einen Verweis auf sich selbst vorbei.

Mit anderen Worten, statt dem folgend in dem designer.cs:

        this.componentInstance = new MyControls.MyComponent();

Ich mag die Formular-Designer beauftragen, den folgenden zu erstellen:

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

Ist es möglich, dies zu erreichen (vorzugsweise durch einige Attribute / Anmerkung oder etwas)?

War es hilfreich?

Lösung

Kann man einfach nicht verwenden die Control.Parent Eigenschaft? Zugegeben, es wird nicht in dem Konstruktor Ihrer Kontrolle festgelegt werden, aber die typische Art und Weise, das zu überwinden ist durch ISupportInitialize und die Arbeit in der EndInit Methode.

Warum müssen Sie den Verweis zurück auf die aufgrund Kontrolle?

Hier, wenn Sie eine neue Konsolenanwendung erstellen, und in diesem Inhalt fügen Sie den Inhalt von Program.cs zu ersetzen, und führen Sie es, werden Sie, dass in bemerken . EndInit , a href die <=" http://msdn.microsoft.com/en- us / library / system.windows.forms.control.parent.aspx“rel = "nofollow noreferrer"> Eltern Eigenschaft richtig eingestellt ist.

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

Andere Tipps

Ich weiß nicht, jede mögliche Weise tatsächlich die Designer-Code emittieren, die einen Nicht-Standard-Konstruktor aufrufe, aber hier ist eine Idee, um es zu bekommen. Setzen Sie Ihren Initialisierungscode in der Standard-Konstruktor des übergeordneten Formulars und verwenden Form.DesignMode, um zu sehen, wenn Sie es ausführen müssen.

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top