Laden...

Control dynamisch aus dll zuweisen

Erstellt von 6274011253792 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.031 Views
6
6274011253792 Themenstarter:in
7 Beiträge seit 2018
vor 4 Jahren
Control dynamisch aus dll zuweisen

Hallo in die Runde,

ich hab irgendwie gerade eine Blockade...

Ich habe ein Tool, welches in einem Raster (Tablelayoutpanel) bestimmte custom controls anzeigen soll. Die Controls werden zur Laufzeit aus einer DLL geladen und es soll möglich sein, später neue Controls über ein erweitern der DLL hinzuzufügen.

Die Configuration, welches Control mit welchen eigenschaften wo im Grid liegt geschieht über eine XML Datei.

es gibt also eine reihe von Controls, welche in der DLL über den entsprechenden ClassName erreichbar sind. Der Class Name ist dann wieder in der XML Datei hinterlegt...

So kann also z.B. in der XML für die Grid Position 1,1 ein Control Namens "Controlxyz" definiert sein, welches dann auch wieder mit der Class Name "Controlxyz" in der DLL zu finden ist. Jetzt ist für mich die Frage, wie kann ich dann zur Laufzeit dem Grid dieses Control zuweisen?

Klassisch würde ich halt

TableLayoutPanel TLP = new TableLayoutPanel();
UserControl1 m = new UserControl1(ITEMNAME, new Size(TLP.Width, TLP.Height));
TLP.Controls.Add(m, RI - 1, CI - 1);

machen...

Aber wie mache ich das dynamisch... Also im Prinzip habe ich den Namen "UserControl1" als String aus der XML und muss diesen dann zuordnen...

Also im Prinzip sowas wie:

TableLayoutPanel TLP = new TableLayoutPanel();
String ControlName = "UserControl1";
@ControlName m = new @ControlName(ITEMNAME, new Size(TLP.Width, TLP.Height));
TLP.Controls.Add(m, RI - 1, CI - 1);

Kann mir hier jemand weiterhelfen?

Vielen herzlichen Dank
Liebe Grüße
Martin

Hinweis von Abt vor 4 Jahren

Bitte BBCodes in Zukunft selbst einfügen. Danke.
[Hinweis] Wie poste ich richtig?

16.834 Beiträge seit 2008
vor 4 Jahren

Man könnte hier eine Factory verwenden, der anhand des Namens das Control erzeugt.

public static class MyControlFactory
{
   public static T CreateControlByName<T>(string name) where T : Control // oder von was Du auch immer ableitest
   {
       switch(name)
           case "ControlNameA":
                    return new ControlA(.....)

       ...
   }

}

Im Endeffekt gibts dafür aber zig potentielle Lösungsmöglichkeiten.

6
6274011253792 Themenstarter:in
7 Beiträge seit 2018
vor 4 Jahren

Hallo Abt,

vielen Dank... Wenn ich das richtig verstehe, müsste dann aber die DLL die Factory enthalten, da die Factory ja die Klasse benötigt. Das würde dann aber ausschließen, das ich verschiedene DLLs (also mehrere gleichzeitig) einbinde...

Ideal in meinen Augen wäre eine art "Find" der ein Control anhand des Namens identifiziert...

Liebe Grüße
Martin

Hinweis von Abt vor 4 Jahren

Bitte keine Full Quotes
[Hinweis] Wie poste ich richtig?

4.939 Beiträge seit 2008
vor 4 Jahren

Du kannst mittels der Activator-Klasse und dessen Methode CreateInstance (bzw. CreateInstanceFrom) Objekte zur Laufzeit (anhand eines voll-qualifizierten Typnamens) erstellen.