Forum: PC-Programmierung vb.net 2010 Express: Forms progamm-gesteuert öffnen


von Leerling (Gast)


Lesenswert?

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!

von eugler (Gast)


Lesenswert?

Ist nicht trivial. Was Du möchtest, ist dynamisches Laden zur Laufzeit 
ohne Kenntnis des Objektes, oder?

von Peter II (Gast)


Lesenswert?

Leerling schrieb:
> Da das Programm den Formnamen(frmFormxyz.name) nicht kennt

warum kann das Programm den namen nicht?

von Leerling (Gast)


Lesenswert?

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!

von Peter II (Gast)


Lesenswert?

dann stecke doch alle Formulare in eine Liste und vergleiche sie 
einzeln.

von Leerling (Gast)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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);

von Christopher (Gast)


Lesenswert?

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

von Leerling (Gast)


Lesenswert?

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!

von Sven H. (dsb_sven)


Lesenswert?

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
Noch kein Account? Hier anmelden.