Autor |
Beitrag |
C#David
Beiträge: 39
|
Verfasst: Di 15.05.18 15:56
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?
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
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 durchlesen, in dem ein bißchen mehr auf die Interaktion mehrerer Forms eingegangen wird.
Für diesen Beitrag haben gedankt: C#David
|
|
C#David
Beiträge: 39
|
Verfasst: 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!
Einloggen, um Attachments anzusehen!
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: C#David
|
|
C#David
Beiträge: 39
|
Verfasst: 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
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 17.05.18 13:10
Dann zeige mal deinen aktuellen Code.
|
|
C#David
Beiträge: 39
|
Verfasst: Do 17.05.18 13:17
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 39
|
Verfasst: 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ü . Danke!!!!
Moderiert von Th69: C#-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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.
Zuletzt bearbeitet von Th69 am Do 17.05.18 16:35, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: C#David
|
|
C#David
Beiträge: 39
|
Verfasst: Do 17.05.18 15:21
Verdammt...das war auch der Fehler. Ein großen THX!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.05.18 21:21
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 20.05.18 19:14
Es sollen wohl eingebettete Fenster sein, so daß das Hauptmenü weiterhin verfügbar ist.
|
|
C#David
Beiträge: 39
|
Verfasst: 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
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 29.05.18 13:25
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
C#David
Beiträge: 39
|
Verfasst: 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 29.05.18 15:47
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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.
|
|