Entwickler-Ecke
WinForms - unterschiedlische Usercontrol dynamisch laden
rano1972 - Di 28.10.08 10:53
Titel: unterschiedlische Usercontrol dynamisch laden
Hallo,
kann mir villeicht jemand hilfen. Ich empfange Daten von Unterschiedlische Hardware. wenn die Daten da sind wird entsprechend einer Configurationsdatei gelesen(pro Hardware einer Configurationsdatei). In diese Datei steht u.a. welches usercontrol(USRchart, USRxygraph,...) soll zur Darstellung der Daten benutzt werden.
wie kann ich ein Usercontrol durch sein Namen(USRchart, USRxygraph,...) dynamisch laden.
unterschidlich HW kann gleiche Usercontrol(mehrer instances) benutzen.
der Control bleibt sollang die HW am PC Angemeldet ist.
Danke
JüTho - Di 28.10.08 13:01
Hallo,
möglich ist es mit Activator.CreateInstance(). Das dadurch zurückgelieferte Objekt muss noch gecastet werden.
Jürgen
rano1972 - Di 28.10.08 13:25
Danke für dein Hinweis,
wirde ich nachgehen.
hast du vielleicht Beispiel Code oder Links.
Danke
JüTho - Di 28.10.08 14:09
Bitte sehr:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| System.Reflection.Assembly aFrmAsm; Type aFrmType; aFrmAsm = System.Reflection.Assembly.LoadFrom("V_Interna.Dll"); aFrmType = aFrmAsm.GetType("JThomas.VSPolis.Interna.CInstall"); Object aFrmObj = Activator.CreateInstance(aFrmType); CInstall fInstall = (CInstall)aFrmObj; DialogResult dr = fInstall.Show(); if (dr != DialogResult.OK) { gg.RejectChanges(); Startfehler = 36; } |
CInstall ist ein Formular für bestimmte Einstellungen nach der Installation.
In der
SDK-Doku/MSDN ist auch ein Beispiel enthalten, aber so wie hier für den Umweg über GetType.
Bitte stört Euch nicht an den Bezeichnern; diese stammen noch aus einer frühen Version, wo ich noch an die ungarische Notation gewöhnt war.
Jürgen
rano1972 - Di 28.10.08 15:25
Hallo,
soll ich alle UserControl im gleichen DLL (namespace) erstellen. Ich hab sie nämlich in unterschiedlichen project in meine Projektmape.
JüTho - Di 28.10.08 16:37
rano1972 hat folgendes geschrieben : |
soll ich alle UserControl im gleichen DLL (namespace) erstellen. Ich hab sie nämlich in unterschiedlichen project in meine Projektmape. |
Das hängt von der Aufgabenstellung ab. Ähnliche UserControls in eine Assembly zusammenfassen, wesentlich verschiedene trennen. Auch der DLL-Name kann (wie in meinem Beispiel) als variabler String übergeben werden; also ist das kein Problem. Jürgen
rano1972 - Di 28.10.08 17:09
Viel Dank Jürgen
Es hat mir geholfen. ich wird es in meine Applikation implementieren.
rano1972 - Do 30.10.08 12:45
Hallo,
das Laden hat soweit supper funktioniert. Ein Problem habe ich noch.
bei jedem UserControl habe ich eine public Function(buffer). Sie soll die Daten bekommen und den Control aktuallisieren.
Aufbau:
ein klasse Hardware hat u.a. eine Objekt private System.Windows.Forms.Control HWControl;
in HWControl wird mit Activator.CreateInstance(aCtrlType); ein control gespeichert.
jdes Mal wenn neue Daten angekommen sind wird die Hardware Klasse aktuallisiert und somit soll auch der control aktuallisiert werden (über diese public Function(buffer).
Danke.
PS: code wäre immer eine gute sache
Christian S. - Do 30.10.08 12:59
Und was ist jetzt das Problem? ;-)
rano1972 - Do 30.10.08 13:02
sorry,
wie kann ich auf diese Funktion zugreifen mit dem Punkt geht nicht.
this.HWControl.function(buffer); GEHT NICHT !!!
Kha - Do 30.10.08 13:12
Ich hoffe, alle deine Usercontrols besitzen eine gemeinsame Basisklasse/Interface mit dieser Methode (wenn nicht, dann wird's Zeit ;) ). Dann musst du nur noch den Rückgabewert von CreateInstance auf diese Basisklasse casten.
rano1972 - Do 30.10.08 13:19
die Basis Klasse für alle Controls ist UserControl!
JüTho - Do 30.10.08 13:41
Kha meint: Die Basisklasse für alle diese UserControls, die den Buffer enthalten, soll UserControlContainingBuffer sein, und dieses ist von UserControl abgeleitet. Dann kannst Du das Ergebnis von CreateInstance eben auf UserControlContainingBuffer casten und kannst auf Buffer zugreifen. Jürgen
rano1972 - Do 30.10.08 16:33
Hallo,
habt Ihr vielleicht code für mich ich hab was getestet aber functioneirt nicht.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| public class UcBase : UserControl { public UcBase() { } public virtual void SetControlData(XmlNodeList NodeDataList, XmlNodeList SensorControlList){} } |
für alle meine Controls gilt
meinControl : UcBase
wenn ich jetzt das hier benutze:
C#-Quelltext
1: 2:
| Object aCtrlObj = Activator.CreateInstance(aCtrlType); return (UcBase)aCtrlObj; |
Danke
Moderiert von
Christian S.: C#-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!