Autor Beitrag
C#David
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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?

ausblenden volle Höhe 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)
        {
            //Öffnen einer neuen Windows-Form            
            frm2.WindowState = FormWindowState.Maximized;
            frm2.TopLevel = true;   
            frm2.MdiParent = this;       
            frm2.Show();            
            //Button 1-3 unsichtbar werden lassen
            button1.Visible = false;
            button2.Visible = false;
            button3.Visible = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Öffnen einer neuen Windows-Form           
            frm3.WindowState = FormWindowState.Maximized;
            frm3.TopLevel = true;
            frm3.MdiParent = this;            
            frm3.Show();
            //Button 1-3 unsichtbar werden lassen
            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 user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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 user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 17.05.18 13:10 
Dann zeige mal deinen aktuellen Code.
C#David Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 17.05.18 13:17 
Form1:
ausblenden volle Höhe 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;
            //Öffnen einer neuen Windows-Form            
            frm2.WindowState = FormWindowState.Maximized;          
            //frm2.TopLevel = true;   
            frm2.MdiParent = this;       
            frm2.Show();            
            //Button 1-3 unsichtbar werden lassen
            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;
            //Öffnen einer neuen Windows-Form           
            frm3.WindowState = FormWindowState.Maximized;
            //frm3.TopLevel = true;
            frm3.MdiParent = this
            frm3.Show();
            //Button 1-3 unsichtbar werden lassen
            button1.Visible = false;
            button2.Visible = false;
            button3.Visible = false;

            SetBackgroundColor();  

            //MessageBox.Show("Vergewissern Sie sich, dass alle angeschlossenen Module...");
        }
       
        private void homeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            Form3 frm3 = new Form3();         
            frm2.Hide();        
            frm3.Hide();
                      

            //Button 1-3 sichtbar werden lassen
            button1.Visible = true;
            button2.Visible = true;
            button3.Visible = true;            
        }            
    }
}


Form2:
ausblenden 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:
ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Beiträge zusammengefasst
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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????
ausblenden 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();           

    //Button 1-3 sichtbar werden lassen
    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 user profile iconTh69: C#-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 17.05.18 15:21 
Verdammt...das war auch der Fehler. Ein großen THX!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.05.18 21:21 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 20.05.18 19:14 
Es sollen wohl eingebettete Fenster sein, so daß das Hauptmenü weiterhin verfügbar ist.
C#David Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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:

ausblenden 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.MdiParent = this;
                frm5.BringToFront();

                this.MinimumSize = new Size(100200);
                this.MaximumSize = new Size(100200);
                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 user profile iconChristian S.: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 29.05.18 13:25 
- Nachträglich durch die Entwickler-Ecke gelöscht -
C#David Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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



BeitragVerfasst: Di 29.05.18 15:47 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 29.05.18 17:06 
Hallo C#David,

user profile iconC#David hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
2:
3:
Form2 frm2 = new Form2();
Form3 frm3 = new Form3();
Form4 frm4 = new Form4();


Ich kann mich nur wiederholen:
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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.