Steuerelemente dynamisch mit Activator.CreateInstance... erstellen


SixDark

Erfahrenes Mitglied
Hallo!

Ich bin gerade dabei etwas zu experimentieren mit der dynamischen Erstellung von Steuerelementen zur Laufzeit. Nun ist es so, dass ich nicht so recht weiß, wie ich das Steuerelement "casten" soll...

Hier mal mein experiementeller Code:

Code:
        private void button2_Click(object sender, EventArgs e)
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            object o = null;
            o = currentDomain.CreateInstanceFromAndUnwrap("C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\System.Windows.Forms.dll", "System.Windows.Forms.TextBox");

            string typename = o.GetType().FullName;
            this.txtAssemblyInfo.Text = typename;

            this.CreateNewControl(o, o.GetType().FullName);
        }

        private void CreateNewControl(object control, string type)
        {
            if (type == "System.Windows.Forms.TextBox")
            {
                TextBox tb = (TextBox)control;
                tb.Name = tb.GetType().Name.ToString() + (this.Controls.Count + 1).ToString();
                tb.Location = new Point(20,50);
                tb.Size = new Size(200,12);
                tb.Text = "Created with Activator.CreateInstance";
                this.Controls.Add(tb);
            }
        }

In der obersten Methode erstelle ich eine neue Instanz einer TextBox in einem Object.
In der zweiten Methode baue ich dann den rest herum um die TextBox anzuzeigen.

Aber so ist das Ganze wirklich nicht besonders toll. Ich komme aber irgendwie nicht auf einen vernünftigen Ansatz.
Hat jemand vielleicht eine Idee wie man das Ganze besser machen könnte?
Im Prinzip geht es um folgendes Ziel: Ich möchte eine WindowsForm erstellen, auf der ich Controls anordnen kann zur Laufzeit. Also so etwas in der Art wie der Designer im VisualStudio. Dazu möchte ich natürlich nicht die Standard-Controls benutzen, sondern später dann davon abgeleitete und veränderte...

Ich hoffe jemand hat eine Idee dazu...

Vielen Dank!
..::SD::..
 

Christian Kusmanow

Erfahrenes Mitglied
Hi SixDark!

Alle System.Windows.Forms Controls leiten doch von System.Windows.Forms.Control ab. Was läge nun näher deine Factory mit dem Type Control ableiten zu lassen. Die erstellten Controls kannst danach in den entsprechenden Typ casten damit Du dessen zusätzlichen Methoden und Propertys verwenden kannst. Indirekt machst das ja schon.

Was nun hinzu kommt sind die nötigen Settings für jedes deiner erweiterten Controls. Sind die zur Laufzeit schon bekannt oder nicht? Wenn nicht, musst noch eine Config zu den einzelnen Steuerelementen hinzufügen. Aus dieser liest dann die nötigen zusätzlichen Settings aus und setzt sie dann via Reflection.
 

SixDark

Erfahrenes Mitglied
Hallo!

Ist zwar sehr spät, dass ich antworte, aber in letzter komme ich aus Zeitmangel selten dazu im Netz zu lesen... So ist das wenn man Familie hat. :)

Ok, die Eigenschaften (ob zusätzlich durch mich hinzugefügt, oder die Standard-Eigenschaften der Controls) sind zu diesem Zeitpunkt alle bekannt. Diese kommen aus einem XML - wie auch der Control-Type.
Leider verstehe ich die Sache mit dem "Type Control" irgendwie nicht?! Könntest Du das bei Gelegenheit näher erläutern wie Du das meinst?

Viele Grüsse
..::SD::..
 

Christian Kusmanow

Erfahrenes Mitglied
Also mit Control Type habe ich gemeint, dass Du deine Factory mit dem Typ Control arbeiten lassen kannst. Du musst also nicht mit dem Typ Object arbeiten, was Dir schon mal das Setzen grundlegender Control Propertys ermöglicht, ohne direkt in den aktuellen Type casten zu müssen.

Also Du erzeugst eine neue Instanz von dem aktuellen finalen Typ, weist sie einem Objekt von Typ Control zu und arbeitest damit erst mal damit weiter. Wenn es weitere Propertys gibt, die nur von dem erweiterten Control implementiert werden (sprich die Windows.Forms und die deine eigenen Controls), castest es dann erst dann in den benötigten Type.
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.613
Mitglieder
187.829
Neuestes Mitglied
AlDi31