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;
//  Assembly laden
aFrmAsm = System.Reflection.Assembly.LoadFrom("V_Interna.Dll");
//  Formular als Typ bestimmen, d.h. für mich Klasse für Formularaufruf
aFrmType = aFrmAsm.GetType("JThomas.VSPolis.Interna.CInstall");
//  diesen Typ erzeugen
Object aFrmObj = Activator.CreateInstance(aFrmType);
//  konvertieren und direkt aktivieren
CInstall fInstall = (CInstall)aFrmObj;
//  erledige die Bearbeitung
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

user profile iconrano1972 hat folgendes geschrieben Zum zitierten Posting springen:
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); // bis hier läuft gut 
return (UcBase)aCtrlObj; // und hier bekomme ich eine Exeption kann nicht in UcBase umgewandelt werden???


Danke

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt