TabControl - Abfangen, auf welchem Karteireiter sich die Maus befindet



  • Hallo,

    ich stehe momentan auf dem Schlauch und komme nicht weiter.
    Ich möchte bei meinem TabControl, einzelne TabPages mit Hilfe eines MouseButtons.Middle-Klicks schließen. Das funktioniert mit meinem Code auch sehr gut; nur möchte ich nicht die aktuell ausgewählte TabPage schließen, sondern die TabPage, wo sich der Mauszeiger gerade befindet.

    Deshalb meine Frage: Wie kann man eine TabPage schließen, auf der gerade ein MouseButtons.Middle-Klick gemacht wurde, allerdings in dem Moment, als der Maus-Klick ausgeführt wurde, nicht die aktuell ausgewählte TabPage ist?

    Meine Lösung für die aktuell ausgewählte TabPage sieht folgendermaßen aus:

    private void tabControl1_MouseClick(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Middle && tabControlDemos.SelectedIndex != 0)
          {
            int NeuerIndex = tabControlDemos.SelectedIndex - 1;
            tabControl1.TabPages.RemoveAt(tabControl1.SelectedIndex);
            tabControl1.SelectedIndex = NeuerIndex;
          }
        }
    

    Vielen Dank im Voraus,
    Ellek 🙂



  • Du must das Maus-Event des Tabs nehmen, nicht des Tabcontrols



  • Danke schon mal für deine Antwort.
    Es scheint aber so, als wenn ein Klick auf den eigentlichen Karteireiter nicht von der TabPage, sondern von dem TabControl abgefangen wird.
    Hat sonst noch jemand eine Idee, wie ich das realisieren kann?

    Anbei ein Screenshot, wo die Maus sich befindet, wenn ich die mittlere Maustaste klicke:

    Screenshot



  • Ohne dass ich nachgeschaut habe, das Event liefert im Parameter Eventargs bestimmt den Tab mit, einfach mal durchdebuggen.



  • Bei den MouseEventArgs habe ich nichts entsprechendes gefunden.
    Bei dem sender-Parameter gibt es zwei Stellen, an denen ich erkennen kann, auf welchen Karteireiter geklickt wurde. Diese sind aber leider nur beim Debuggen zugänglich:

    ((System.Windows.Forms.TabControl)(sender)).lastSelection
    System.Windows.Forms.TabControl.TABCONTROLSTATE_hotTrack
    

    Vielleicht noch eine Idee 😕



  • Na das reicht doch! Frage den Sender entsprechend ab und fertig.



  • Das bekomme ich leider nicht hin.
    Diese Werte kann ich zwar beim Debuggen sehen, bekomme sie aber nicht über meinen Code abgefangen. 😞



  • Ellek schrieb:

    Das bekomme ich leider nicht hin.
    Diese Werte kann ich zwar beim Debuggen sehen, bekomme sie aber nicht über meinen Code abgefangen. 😞

    alles was Du im Debugger siehst kannste auch während der Laufzeit auswerten, musst eben entsprechend casten, etc.



  • Dem scheint nicht so zu sein.
    Es scheinen interne Debuginformationen zu sein, an die ich nicht ran komme.
    Beim Kompilieren bekomme ich sofort eine Fehlermeldung.

    Beispiel:

    "System.Windows.Forms.TabControl" enthält keine Definition für "lastSelection".



  • SeboStone schrieb:

    alles was Du im Debugger siehst kannste auch während der Laufzeit auswerten, musst eben entsprechend casten, etc.

    Stimmit so leider nicht. Im Debugger kannst du problemlos aud private / protected Member einer Klasse zugreifen. Im Code funktioniert das (natürlich) nicht.



  • Mit diesem Event funktioniert es hier. Da die Reiter zum TabControl gehören und nicht zu den TabPages, musst Du sicherstellen das e.X und e.Y der Mouse innerhalb des Recangles des Reiters sich befindet.

    private void tabControl1_MouseClick(object sender, MouseEventArgs e)
    {
       Rectangle tabRect;
       if (e.Button == MouseButtons.Middle)
       {
           for (int i = 0; i < tabControl1.TabPages.Count; i++)
           {
               tabRect = tabControl1.GetTabRect(i);
               if (e.X > tabRect.Left && e.X < tabRect.Right && e.Y > tabRect.Top && e.Y < tabRect.Bottom)
               {
                   tabControl1.TabPages.RemoveAt(i);
               }
            }
        }
    }
    


  • Danke!
    Auf die Lösung wäre ich ja nie gekommen, dass man die Maus-Koordinaten abfangen muss.
    Die Lösung funktioniert einwandfrei. 🙂



  • Herb schrieb:

    Stimmit so leider nicht. Im Debugger kannst du problemlos aud private / protected Member einer Klasse zugreifen. Im Code funktioniert das (natürlich) nicht.

    Ja das ist richtig, habe aber angenommen, dass es ein public property ist. Aber jetzt hat er ja seine Lösung.


Anmelden zum Antworten