keine doppelt geöffneten Fenster
-
Hy,
habe ein etwas komplexes Problem:
ich habe ein Hauptfenster mit einer Liste und bei DoubleClick auf ein ListItem öffnet sich ein Extrafenster. So weit so gut. Jetzt gibt es aber ein Problem: Wenn man auf ein und das selbe Item 2x klickt, dann öffnet sich 2x dasselbe Fenster! Ich möchte, dass beim Klick auf ein Item, wo schon ein Fenster offen ist, dieses Fenster nur reaktiviert wird und kein neues geöffnet wird. Ich hab schon nach Fenster-Handlen gegoogelt, aber so richtig hat mir das alles nicht geholfen. Habt Ihr ne Idee?
Ich danke schonmal im Voraus
-
folgendes:
Form1:
private Form2 form; public Form() { form = new Form2; } . . . private void button_Click(object sender, EventArgs e) { if(form.Open) //Form wird bereits angezeigt else form.Show(); //Form darf angezeigt werden }
Form2:
private bool open; public bool Open { get{return open;} set{open = value;} } public Form2() { open = false; } private void Form2_Show(object sender, EventArgs e) { open = true; } private void Form2_Closing(....) { open = fals; }
so ungefähr :xmas1:
-
Mir war gerade langweilig
private void ListView_MouseDoubleKlick(object sender, MouseEventArgs e) { // Das ListViewItem holen, das geklickt wurde ListViewItem item = ListView.GetItemAt(e.X, e.Y) // Für das Item wurde noch kein Fenster geöffnet if(item.Tag == null) { // Neues Fenster erzeugen Form2 form = new Form2(); // Damit wir mitbekommen, wann das Fenster geschlossen wird form.FormClosed += new EventHandler(form_Closed); item.Tag = form; form.Tag = item; } // Es wurde bereits ein Fenster für das Item geöffnet else { // Das Fenster des Items haben wir vorhin im Tag-Property abgelegt Form2 form = (Form2)item.Tag; // Fenster reaktivieren form.BringToFront(); form.SetFocus(); } } private void form_Closed(object sender, EventArgs e) { // Das Fenster, das geschlossen wurde wird als 'sender' übergeben Form2 form = (Form2)sender; // Das zum Fenster gehörende Item befindet sich im Tag-Property des Fensters ListViewItem item = (ListViewItem)form.Tag; // Das Tag-Property des Items zurücksetzen, sonst kanns Probleme geben. item.Tag = null; }
Habs nicht getestet, sollte aber stimmen. Vielleicht gibts auch noch ne einfachere Lösung, aber das ist, was mir spontan dazu eingefallen ist
Ich bin davon ausgegangen, das du für mehrere Items Fenster öffnen möchtest, aber für jedes Item nur ein Fenster.
-
perfekt, einwandfrei. Dank an o.O und Helfer, jetzt klappts so wie ich will!
-
Leute?!
Also die Lösung von „Helfer“ mag ja je nach Situation noch in Ordnung sein. Die von „o.O“ ist nur noch komisch.
– Schon mal was vom Singleton-Entwurfsmuster gehört?
-
Hm, Singleton hört sich ja ganz nett an, aber:
o.O schrieb:
Ich bin davon ausgegangen, das du für mehrere Items Fenster öffnen möchtest, aber für jedes Item nur ein Fenster.
Ergo, mehrere Instanzen ein und derselben Klasse, aber für jedes Item nur eins.
Wikipedia schrieb:
Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt werden kann.
Bringt nichts, weils dann nur maximal ein Fenster gibt und nicht mehrere.
Oder hab ich da etwas falsch verstanden?
Wenn ja, lasst mich bitte nicht dumm sterben
-
Zerebus schrieb:
Hm, Singleton hört sich ja ganz nett an, aber:
o.O schrieb:
Ich bin davon ausgegangen, das du für mehrere Items Fenster öffnen möchtest, aber für jedes Item nur ein Fenster.
Okay, das ist etwas anderes. Hatte ich nicht gelesen. In diesem Fall bräuchte man natürlich eine Möglichkeit, einzelne Fenster einzelnen Listeneinträgen zuzuordnen und hier sind die 'Tag'-Eigenschaften gar nicht schlecht geeignet.