Hallo zusammen, ich habe eine Mdi-Form mit einigen Child-Formen. Auf der Mdi sitzt das Menustrip mit den diversen Auswahlmöglichkeiten. Nun möchte ich, dass programmabhängig, Childformen geöffnet werden, ohne das ich manuell im Menu anklicke. Standardmässig werden vom Menu her die Formen so geöffnet: frmFormxyz.MdiParent = Me frmFormxyz.Show() Da das Programm den Formnamen(frmFormxyz.name) nicht kennt, dachte ich mir, dass ich diesen Namen per Variable übergebe, so etwa: Dim variable as String .. .. .. variable = "frmFormxyz" Nur, wie binde ich diese Variable in diese zwei Zeilen ein? .MdiParent = Me .Show() Ein Tag voller Verzweifelung und Googleritis liegt hinter mir... Habt ihr einen Rat? Besten Dank!
Ist nicht trivial. Was Du möchtest, ist dynamisches Laden zur Laufzeit ohne Kenntnis des Objektes, oder?
Leerling schrieb: > Da das Programm den Formnamen(frmFormxyz.name) nicht kennt warum kann das Programm den namen nicht?
eugler schrieb: > ohne Kenntnis des Objektes, oder? Von der Form die geladen werden soll kenne ich die .Name und .Text Eigenschaften. Diese liegen in einer String-Variablen vor. Ich hole mal was weiter aus: Das Hauptformula(Mdi) beinhaltet ein Menü/Untermenüs mit ca. 60 Einträgen zum Aufrufen von 60 verschiedenen Forms(Child). Um dem Nutzer das wiederfinden einer Form zu erleichtern, kann eine Form zu den 'Favoriten' abgelegt werden. Dazu habe ich eine Listview am linken Rand der Mdi gesetzt in diese der Nutzer seine Form einträgt. Dabei werden die .Name und .Text Eigenschaften dieser Form in String-Variablen gesichert. Das funktioniert soweit alles. Wenn nun der Nutzer auf einen Eintrag der Favoritenliste doppelklickt, soll die gewünschte Form geladen werden. An eben diesen Ladevorgang knobel ich seit gestern rum... Schönen Gruß und danke für eure Beiträge!
dann stecke doch alle Formulare in eine Liste und vergleiche sie einzeln.
Peter II schrieb: > dann stecke doch alle Formulare in eine Liste und vergleiche sie > einzeln. Kannst du das genauer erklären? Warum muss ich was vergleichen? Ich kenne(habe) die .Name Eigenschaft der gewünschten Form. Nur, ich schaffe es nicht diese .Name in die Show()-Befehlssequenz einzubauen.
Leerling schrieb: > Peter II schrieb: >> dann stecke doch alle Formulare in eine Liste und vergleiche sie >> einzeln. > > Kannst du das genauer erklären? Warum muss ich was vergleichen? Ich > kenne(habe) die .Name Eigenschaft der gewünschten Form. Nur, ich schaffe > es nicht diese .Name in die Show()-Befehlssequenz einzubauen. Stichwort: Reflection
1 | string formName = "Form1"; |
2 | Assembly asm = Assembly.GetExecutingAssembly(); |
3 | // falls der vollständige Typname bekannt ist
|
4 | // z.B. über xyz.GetType().FullName statt xyz.Name
|
5 | // reicht
|
6 | //var ty = asm.GetType(fullName);
|
7 | var allTypes = asm.GetTypes(); |
8 | var tys = (from t in allTypes where t.Name == formName select t).ToArray(); |
9 | // MethodInfo für Show ohne Parameter
|
10 | var mi = tys[0].GetMethod("Show", new Type[0]); |
11 | // Instanz erzeugen
|
12 | var inst = Activator.CreateInstance(tys[0]); |
13 | // und das ganze Aufrufen
|
14 | mi.Invoke(inst, null); |
Noch einfacher gehts in einen Array diesen gehst du dann mit einer For-Schleife durch und überprüfst ob der Formname gleich deiner Variable ist
Ohh, da hab ich ja einige Anregungen bekommen. Da ich von Reflections noch 'nie' was gelesen habe muss ich mich da reinarbeiten. Besten Dank für eure Tipps!
Du kannst auch komplette Objekte in der Liste einsortieren. Dann kannst du z.B. sowas machen: (ListBox.SelectedItem as Form).MdiParent = me (ListBox.SelectedItem as Form).Show() (Wenn die VB Syntax nicht 100% ist nicht böse sein...)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.