Entwickler-Ecke

WinForms - Probleme mit Forms


Xardas008 - Mo 27.08.07 17:08
Titel: Probleme mit Forms
Hi ihr,

folgendes Problem habe ich:

Ich habe in meinem Projekt mehr als 1 Formular. Ein Hauptfenster, wo der User entscheidet was er machen möchte, z.B. einen Neuen Datensatz anlegen, oder einfach nur das Programm beenden.

So das öffnen von einem anderen Formular funktioniert auch soweit. Nur will ich in der Zeit, wo ich z.B. den neuen Datensatz anlege, das Hauptfenster im Hintergrund verstecken, hab ich noch nicht getestet dürfte aber gehen.

So und wenn ich jetzt mit dem Anlegen fertig bin, dann schließe ich das Fenster wieder, so und hier mein Problem, wie bekomme ich das andere Fenster wieder sichtbar?

Ich weiß die Frage hört sich sehr dumm an aber


Moderiert von user profile iconUGrohne: Topic aus C# - Die Sprache verschoben am Mo 27.08.2007 um 18:21


JüTho - Mo 27.08.07 18:34
Titel: Re: Probleme mit Forms
user profile iconXardas008 hat folgendes geschrieben:

So und wenn ich jetzt mit dem Anlegen fertig bin, dann schließe ich das Fenster wieder, so und hier mein Problem, wie bekomme ich das andere Fenster wieder sichtbar?

Das hängt auch sehr davon ab, wie Du das Hauptformular verbirgst. Untersuche einmal in der SDK-Doku die Stichworte Visible, Form.(De)Activated-Ereignis, Form.ShowInTaskbar-Eigenschaft.

Jürgen


Xardas008 - Mo 27.08.07 18:40

Hilft mir leider nicht sehr viel weiter.

mit this.Hide() verstecke ich das Fenster. Normalerweise kann ichs ja mit der Funktion Show() wieder sichtbar machen. Das Problem jedoch ist, dass das Mainfenster in den anderen Formularen nicht sichtbar ist, obwohl public.
Als Verweis einbinden geht nicht, da dies eine Ringdings ergeben würde (ergibt eine Fehlermeldung) was ja auch richtig ist.


JüTho - Mo 27.08.07 19:05

Deine Auskünfte sind trotzdem unvollständig. In welchem Zusammenhang (Methode) rufst Du Hide() auf? Wann und wo kommt Form2.Show() oder Form2.ShowDialog()?

Du könntest auch einen Delegate erzeugen, der Form1.Show() ausführt; in Form2.Closing wird dieser Delegate angestoßen. (Das habe ich nur so hingeschrieben, ohne mir die einzelnen Schritte und Voraussetzungen genauer zu überlegen; das musst Du ggf. selbst heraussuchen. Aber eine Möglichkeit ist es jedenfalls: auf diese Weise können Methoden über Formular-Grenzen hinweg arbeiten, auch wenn die Formulare selbst nichts voneinander wissen.)

Jürgen


Xardas008 - Mo 27.08.07 19:32

Irgendwie schein ich übermüdet zu sein.

Ich bekomms einfach nicht hin die Methode Show() von der Klasse Form einem Delegate zu übergeben.

Ich versuche oben genannte Frage von dir, JüTho, wo ich das Hide und so aufrufe ma zu erläutern.

Wenn ich auf einen Button auf der Frm_Main klicke, dann wird Form2.Show() aufgerufen, direkt danach soll this.Hide() ausgeführt werden, um das Hauptfenster zu verstecken ohne dass das Programm beendet wird. Funktioniert ja auch einwandfrei. So wenn der User jetzt in Form2 seine Eingabe getätigt hat, soll er wieder zurück zur Frm_Main um dort zu entscheiden was er machen will, z.B. sich alle Datensätze anzeigen lassen. Und da ist mein Problem zur zeit.


Xardas008 - Mo 27.08.07 20:48


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        public delegate void Fen();

        private void Btn_Neu_Click(object sender, EventArgs e)
        {
            //Hier wird das Formular geöffnet um einen neuen Datensatz anzulegen
            Frm_Neu Neues_Fenster = new Frm_Neu();
            Fen Fens = new Fen(this.Show);
            Neues_Fenster.Show();



              this.Hide();



        }


So habe ich es grade ma versucht, den Delegate meckert er mir jetzt nicht mehr an, jedoch lässt sich dieser trotzdem nicht aus anderen Forms heraus aufrufen. Wieso???? Er kennt meine Variable (Delegate) in den anderen Fenstern nicht.


Kha - Mo 27.08.07 22:11

user profile iconXardas008 hat folgendes geschrieben:
Als Verweis einbinden geht nicht, da dies eine Ringdings ergeben würde (ergibt eine Fehlermeldung) was ja auch richtig ist.
Wie meinen :gruebel: ?
Und was spricht gegen folgenden Code?

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Form details = new DetailsForm();
details.FormClosed += delegate
{
  this.Show();
};

details.Show();
this.Hide();


Xardas008 - Di 28.08.07 14:32

user profile iconKhabarakh hat folgendes geschrieben:
user profile iconXardas008 hat folgendes geschrieben:
Als Verweis einbinden geht nicht, da dies eine Ringdings ergeben würde (ergibt eine Fehlermeldung) was ja auch richtig ist.
Wie meinen

Probiers doch aus, nimm 2 Projekte, binde Projekt1 in Projekt2 ein als Verweis und dann Projekt2 in Projekt1, geht nicht.
Und deshalb sehe ich auch nicht die Member aus Projekt1 in Projekt2 und kann demnach dort nicht drauf zugreifen.
Und das Fenster1 muss aus Fenster2 wieder sichtbar gemacht werden. Oder es muss halt ein Ereignis laufen, welches darauf reagiert, wenn Fenster2 wieder geschlossen wird und dann Fenster1 wieder zum Vorschein bringt.

Nur welches Ereignis könnte dies lösen?


Christian S. - Di 28.08.07 15:34

Müssen die Forms denn in zwei verschiedenen Projekten sein?


JüTho - Di 28.08.07 16:06

Hier hast Du doch schon die Lösung bekommen, einzubinden in MainForm.BtnOpenClick():
user profile iconKhabarakh hat folgendes geschrieben:
Und was spricht gegen folgenden Code?

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Form details = new DetailsForm();
details.FormClosed += delegate
{
  this.Show();
};

details.Show();
this.Hide();

Wenn im DetailsForm das FormClosed-Ereignis ausgelöst wird, wird der "namenlose" Delegate gerufen und damit MainForm.Show() ausgeführt.

Jürgen


Xardas008 - Di 28.08.07 16:15

user profile iconChristian S. hat folgendes geschrieben:
Müssen die Forms denn in zwei verschiedenen Projekten sein?


Danke dir, genau das war mein Problem. Dadurch dass ich immer nur über Datei Hinzufügen ein neues Projekt hinzugefügt habe, existierten auch verschiedene Namespaces. Deshalb waren die Sachen in den anderen Forms nie sichtbar.
Hab das ganze jetzt in einem Projekt drin und es funktioniert.