Entwickler-Ecke
WinForms - Prüfen ob eine Form geöffnet ist
Ccenter - Fr 09.10.09 19:49
Titel: Prüfen ob eine Form geöffnet ist
Hallo,
ich habe gerade ein Problem:
also ich habe eine Form1 mit 2 Buttons. Wenn ich auf Button1 klicke, kommt eine Form2. Wenn ich jetzt auf Button2 klicke, möchte ich gerne Prüfen, ob Form2 offen ist oder nicht.
Hab google zwar benutzt, aber nichts wirklich hilfreiches gefunden, nur für vb.
Dort wurde etwas gesagt wie:
Quelltext
1: 2: 3: 4: 5:
| If IsFormLoaded(einstellungen) Then MsgBox "Ist Offen" Else MsgBox "Ist nicht offen" End If |
Habe versucht das auf C# zu übertragen, ist mir aber missglückt. Könnte mir einer sagen wie das geht?
JasonDelife - Fr 09.10.09 21:13
Lege die Form als Klassenmember an und prüfe auf null bzw. Visible.
Grüße, JasonDelife.
Ccenter - Sa 10.10.09 11:51
Danke für die Antworten aber ich hatte in meinem Ausgangspost ja schon gesagt das ich nicht damit klar komme, vb auf C# zu übertragen.
@JasonDelife: Blöde Frage aber was meinst du mit "Lege die Form als Klassenmember an" ?
Das mit null hab ich schon vorher ausprobiert, ist mir aber auch nicht geglückt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| private void button2_Click(object sender, EventArgs e) { if (Form2 == null) { MessageBox.Show("Form2 ist nicht offen"); } } |
was soll da nach "Form2" hin?
JüTho - Sa 10.10.09 12:16
Hallo,
du musst unterscheiden zwischen einer Klasse (= Form2) und einem konkreten Objekt (Instanz). Die Definition einer Klasse geschieht mit den
allgemeinen Namen und Festlegungen, die Arbeit innerhalb einer Klasse geschieht mit
konkreten Bestandteilen dieser Klasse.
Ccenter hat folgendes geschrieben : |
also ich habe eine Form1 mit 2 Buttons. Wenn ich auf Button1 klicke, kommt eine Form2. Wenn ich jetzt auf Button2 klicke, möchte ich gerne Prüfen, ob Form2 offen ist oder nicht. |
Du befindest dich in einer Instanz mainForm der Form1-Klasse. Wenn du dort auf Button1 klickst, erzeugst du eine Instanz secondForm der Form2-Klasse. Alles, was danach folgt, wird innerhalb jeder Form1-Instanz mit secondForm gemacht. Damit reduziert sich das Problem darauf, wo alles secondForm benutzt wird und wo es bekanntgemacht (deklariert) wird.
Jason meinte also, dass secondForm nicht nur innerhalb von Button1_Click bekannt sein soll, sondern innerhalb der ganzen Form1-Klasse. Dann ist secondForm überall in einer Form1-Instanz bekannt, also auch innerhalb von Button2_Click. Dort kannst du also die gewünschten Prüfungen vornehmen.
C#-Quelltext
1: 2: 3:
| if ( (secondForm == null) || ( ! secondForm.Visible ) ) ShowMessage("Pech gehabt"); else { } |
Dein Problem hat also fast nichts mit VB oder C# zu tun, sondern mit Klassenaufbau und Geltungsbereich von Variablen. (Letzteres ist zwar eine Sache der Sprache, aber dein Problem würde in VB genauso auftreten.)
Dringende Empfehlung: Arbeite dich grundsätzlich in C# und vor allem auch OOP ein, z.B. anhand der
OpenBooks [
http://www.galileocomputing.de/openbook] (dort findest du Visual C#, C#, OOP).
Gruß Jürgen
SyLuS - Mi 07.01.15 14:28
Hallo,
bin gerade über die Suche auf diesen Post hier gestoßen.
Muss ja sagen ich bin etwas geschockt. Ihr hättet dem armen das ruhig an einem Beispiel erklären können anstatt ihm alles in Theorie zu servieren.
Daher packe ich (Auch wenn es ein alter Thread ist, das mir in dem Fall egal. Aber so kann man den Leuten das Programmieren auch vermiesen) jetzt mal ein kleines Beispiel dazu.
Wie bereits erwähnt wird zuerst eine Klasse "Form1" erzeugt, welche 2 Buttons besitzt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) {
}
private void button2_Click(object sender, EventArgs e) {
} } |
Nun erstellen wir eine Form2, die geöffnet werden soll. Den Code von Form2 lasse ich hier aber weg.
Jetzt erweitern wir 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:
| public partial class Form1 : Form { private Form2 form2Object = new Form2();
public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { form2Object = new Form2();
form2Object.Show(); }
private void button2_Click(object sender, EventArgs e) { if (form2Object.IsDisposed) { MessageBox.Show("Form2 wird NICHT angezeigt"); } else { MessageBox.Show("Form2 WIRD angezeigt"); } } } |
Ich hoffe, dass dieses Beispiel gerade Anfängern, wie dem Thread-Starter, ein wenig hilft zu begreifen, was ein Object und was eine Klasse ist und wie es sich mit der Sichtbarkeit/Zugreifbarkeit verhält wenn man die Variable nicht in der Methode sondern in der Klasse angelegt wird.
C# - Mi 07.01.15 19:00
Hallo,
du kannst bei WinForms auch einfach
nehmen. Da sind alle geöffneten Forms aufgelistet (egal ob sichtbar oder nicht).
Und wenn du prüfen willst, ob schon irgendein Fenster vom Typ
Form2 offen ist, kannst du so prüfen:
C#-Quelltext
1:
| bool form2Opened = Application.OpenForms.Any(f => f is Form2); |
Das ist im Prinzip das Gleiche wie:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| bool form2Opened; foreach(Form f in Application.OpenForms) { if (f.GetType() == typeof(Form2)) { form2Opened = true; } } |
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!