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
Bitte BBCodes in Zukunft selbst einfügen. Danke.
[Hinweis] Wie poste ich richtig?
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
Bitte keine Full Quotes
[Hinweis] Wie poste ich richtig?
Du kannst mittels der Activator-Klasse und dessen Methode CreateInstance
(bzw. CreateInstanceFrom
) Objekte zur Laufzeit (anhand eines voll-qualifizierten Typnamens) erstellen.