Entwickler-Ecke
WinForms - ToolStripMenuItem-Navigation
C#David - Di 15.05.18 15:56
Titel: ToolStripMenuItem-Navigation
Hey Leute,
ich möchte eine Windows-Forms-Application bestehend aus 3 Forms gestalten. In der Form 1 sollen sich 2 Buttons befinden,worüber ich Form 2 bzw. Form 3 öffnen kann.
In jeder Form an sich soll sich ein "ToolStripMenüItem" befinden, worüber ich zurück zum Hauptmenü (in dem Fall Form 1) kommen kann. Welchen Befehl müss ich verwenden, um beim Anklicken des "Home"-Buttons zum Hauptmenü (Form 1) zurückzukehren, ohne das geöffnete Fenster (Form2/form3 ) manuell schlißene zu müssen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace FormsApplication { public partial class Form1 : Form { Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { frm2.WindowState = FormWindowState.Maximized; frm2.TopLevel = true; frm2.MdiParent = this; frm2.Show(); button1.Visible = false; button2.Visible = false; button3.Visible = false; }
private void button2_Click(object sender, EventArgs e) { frm3.WindowState = FormWindowState.Maximized; frm3.TopLevel = true; frm3.MdiParent = this; frm3.Show(); button1.Visible = false; button2.Visible = false; button3.Visible = false; } private void homeToolStripMenuItem_Click(object sender, EventArgs e) { Form1 frm1 = new Form1(); frm1.Show(); } } } |
Moderiert von
Christian S.: C#-Tags hinzugefügt
Th69 - Di 15.05.18 17:46
Einfach
frmX.Hide() (oder eben
frmX.Visible = false, was intern zum gleichen Verhalten führt).
Die bisherigen 2 Zeilen im
homeToolStripMenuItem_Click sind aber komplett falsch, denn damit öffnest du ja ein
neues Fenster.
Du hast technisch gesehen immer die Hauptform geöffnet, denn
Form1 ist ja bei dir der
MdiParent der beiden anderen Forms (denn sonst würdest du ja das
ToolStripMenu ja gar nicht mehr sehen).
PS: Du kannst dir auch mal meinen Artikel
Kommunikation von 2 Forms [
http://www.bitel.net/dghm1164/programming/Kommunikation_von_2_Forms.html] durchlesen, in dem ein bißchen mehr auf die Interaktion mehrerer Forms eingegangen wird.
C#David - Mi 16.05.18 10:48
Vielen Dank für deine schnelle Antwort. Mit den Befehl funktioniert es. Allerdings habe ich jetzt den Effekt, dass wenn ich Form 2/3 über einen Button öffne, anschließend über den "Home-Button" zum Hauptmenü zurückkehre und danach erneut Form 2/3 öffne eine Fehlermeldung kommt (Siehe Anhang). Womit hängt das jetzt wieder zusammen? Ich habe von allen Forms die Eigenschaft "IsMidiContainer" auf "TRUE" gesetzt. Vielen Dank!
Th69 - Mi 16.05.18 11:51
Das TopLevel macht bei einem MDI-Childfenster keinen Sinn, daher lass es weg. Ansonsten packe die Eigenschaftszuweisungen direkt in den Konstruktor der Klasse.
C#David - Do 17.05.18 13:00
Hey Leute,
ganz das Thema schließen kann ich leider noch nicht. Und zwar tritt jetzt das Problem auf, dass wenn ich mit den "Home-Button" zum Hauptmenü zurückkehre und dann den Befehl
frmX.hide() anwende, die Button's der ursprünglichen Form noch angezeigt werden.
FrmX.Dispose() hat auch nichts gebracht?? Nochmals vielen Dank!!
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Do 17.05.18 13:10
Dann zeige mal deinen aktuellen Code.
C#David - Do 17.05.18 13:17
Form1:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net;
namespace FormsApplication { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
public void SetBackgroundColor() { this.BackColor = System.Drawing.Color.Red; }
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); Size = this.Size; frm2.WindowState = FormWindowState.Maximized; frm2.MdiParent = this; frm2.Show(); button1.Visible = false; button2.Visible = false; button3.Visible = false;
SetBackgroundColor(); }
private void button2_Click(object sender, EventArgs e) { Form3 frm3 = new Form3(); Size = this.Size; frm3.WindowState = FormWindowState.Maximized; frm3.MdiParent = this; frm3.Show(); button1.Visible = false; button2.Visible = false; button3.Visible = false;
SetBackgroundColor();
} private void homeToolStripMenuItem_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); frm2.Hide(); frm3.Hide();
button1.Visible = true; button2.Visible = true; button3.Visible = true; } } } |
Form2:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace FormsApplication { public partial class Form2 : Form { public Form2() { InitializeComponent(); }
private void button2_Click(object sender, EventArgs e) { Form1 formeins = new Form1(); }
private void Form2_Leave(object sender, EventArgs e) { button1.Visible = false; } } } |
Form3:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace FormsApplication { public partial class Form3 : Form { public Form3() { InitializeComponent(); } } } |
Moderiert von
Th69: C#-Tags hinzugefügt
Moderiert von
Th69: Beiträge zusammengefasst
Ralf Jansen - Do 17.05.18 13:43
Auf der MDI Container Form solltest du keine weiteren Controls haben außer eben den weiteren MDI Child formen. Ist auch eine ganze schräge UI wenn ich mir versuche vorzustellen was du da erreichen willst. Vermutlich ist MDI eigentlich gar nicht das was du willst.
Eine Form wie deine MDI Childs sind auch nur Controls. Die liegen gleichberechtigt mit anderen Controls auf dem MDI Container rum. Ein Button ist also gleichberechtigt mit einer Form. Die ganzen Controls auf deinem MDI Container werden jetzt in irgendeiner (von außen am besten als zufällig betrachten) Reihenfolge da rum. Mal ist ein ~wirkliches~ Control der Form im Vordergrund mal vielleicht eine deiner MDI Childformen. Es könnte also sogar so sein das du nur ein Teil der Controls siehst die direkt auf der MDI Container liegen weil zufällig ein paar gerade in der z-Order hinter der MDI Child Form liegen und ein Tei davor. Das ganze könntest du mit den BringToFront bzw. SendToBack Methoden von Controls korrigieren und eine dir genehme Control Reihenfolge herstelln aber eigentlich solltest du, wie am Angang geschrieben, einfach keine Controls auf dem MDI Container haben. Der ist eigentlich nur als Container für andere Formen gedacht und sonst für nix anderes.
C#David - Do 17.05.18 14:39
Genauso ist es...die Forms liegen alle in den MDI-Container. Habe es mit SendToBack()/ BringToFront() versucht zu lösen....leider erfolglos. Die Buttons der
ursprüngich geöffneten Form werden nach wie vor angezeigt????
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void homeToolStripMenuItem_Click(object sender, EventArgs e) { Form1 frm1 = new Form1(); Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); frm1.BringToFront(); frm2.Hide(); frm2.SendToBack(); frm3.Hide(); frm3.SendToBack();
button1.Visible = true; button2.Visible = true; button3.Visible = true; } |
Wenn ich die Control-Funktionen "
frmX.WindowState = FormWindowState.Maximized;" &
frmX.MdiChildren = this; darauf anwende, sieht man erstmal, dass alle Fenster in den MDI-Cntainer enthalten sind beziehungsweise kommt ne Fehlermeldung??
Wie in Gottes Namen löse dieses Problem....ich möchte über den MenüStripButton doch einfach nur zurück zum Hauptmenü :D. Danke!!!!
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Do 17.05.18 14:48
Warum erstellst du jetzt immer neue Form-Objekte? In deinem 1. Code waren diese ja noch Membervariablen, so daß du darauf dann in den ganzen Klassenmethoden zugreifen kannst.
Und den Beitrag von Ralf solltest du auch beachten.
PS: Bitte demnächst selber die Code-Tags (C#) bei deinen Beiträgen setzen.
C#David - Do 17.05.18 15:21
Verdammt...das war auch der Fehler. Ein großen THX!
Delete - Do 17.05.18 21:21
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - So 20.05.18 19:14
Es sollen wohl eingebettete Fenster sein, so daß das Hauptmenü weiterhin verfügbar ist.
C#David - Di 29.05.18 13:03
Hey Leute,
ich möchte nun in meinen bestehenden Programm durch Anklicken einer bestimmten Teilfäche eine weitere Form (Form5) öffnen, welche fixe Größe haben soll, und sich im Bild vor allen bereits geöffneten Form-Fenstern (Form2,3,4) befinden soll. Dazu habe ich die Funktonen "Hide(), SendToBack(), BringToFront() in den entsprechenden Klick-Event verwendet und folgenden Code geschrieben:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| private void panel1_Click(object sender, EventArgs e) { _pt = PointToClient(Cursor.Position); var KlickedEllipse = from Ellipse in EllipseCollection where Ellipse.Contains(_pt) select Ellipse; if (KlickedEllipse != null) { Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); Form4 frm4 = new Form4(); Form5 frm5 = new Form5(); frm5.Show(); frm5.BringToFront();
this.MinimumSize = new Size(100, 200); this.MaximumSize = new Size(100, 200); frm2.Hide(); frm2.SendToBack(); frm3.Hide(); frm3.SendToBack(); frm4.Hide(); frm4.SendToBack(); frm4.WindowState = FormWindowState.Maximized; } } |
Leider kann ich es so nicht in den Vordergrund bringen. Es hat auch nichts gebracht, Form5 als MdiContainer zu deklarieren und "MdiParent" darauf
anzuwenden??? Vielen Dank!
Moderiert von
Christian S.: C#-Tags hinzugefügt
Delete - Di 29.05.18 13:25
- Nachträglich durch die Entwickler-Ecke gelöscht -
C#David - Di 29.05.18 14:03
Die Funkton "frm5.BringToFront();" ist im Code enthalten, habe es auch mal in umgekehrter Reihenfolge mit frm5.Show() probiert...hat auch nichts
bewirkt. Die Unterfenster Form2 bis Form5 sollen im Hauptfenster Form5 eingebettet sein. Vielen Dank!
Ralf Jansen - Di 29.05.18 14:37
Übergebe mal this an deine Formen beim Aufruf von Show. Im Moment da du scheinbar weder MDIParent noch Parent setzt (die Form die du an show übergibst wird zum Parent) hängen die isoliert alleine rum. Ich wüßte dann nicht in Relation zu was ein BringToFront/SendToBack arbeiten sollte. Vermutlich machen die Methoden dann einfach gar nix.
Delete - Di 29.05.18 15:47
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Di 29.05.18 17:06
Hallo C#David,
C#David hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3:
| Form2 frm2 = new Form2(); Form3 frm3 = new Form3(); Form4 frm4 = new Form4(); |
|
Ich kann mich nur wiederholen:
Th69 hat folgendes geschrieben : |
Warum erstellst du jetzt immer neue Form-Objekte? In deinem 1. Code waren diese ja noch Membervariablen, so daß du darauf dann in den ganzen Klassenmethoden zugreifen kannst.
|
Du solltest verstehen lernen, was eine Objektinstanz ist - und wenn du eine
neue erstellst, diese nichts mit der vorher erstellten zu tun hat.
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!