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.


Anmelden zum Antworten