Announcement

Collapse
No announcement yet.

Überlisten der TabControl.ControlCollection

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Überlisten der TabControl.ControlCollection

    Hallo,

    Ich habe in meinem Project eine Classe von TabPage und TabControl abgeleitet.
    Die TabPage hat eine zusätzlich Eigenschaft "Visible" bekommen, welche die Instanz aus der "TabPages" Eigenschaft des TabControls entfernt.
    Und zwar mittels "Remove(TabPage)".

    Da ich diese Eigenschaft (Visible) dynamisch zur Laufzeit setze, sind mir unschöne visuelle effekte aufgefallen (flickern der Seite).

    Mittels Lutz Roeder's reflector habe ich dann herausgefunden, daß das Framework die "SelectedIndex" eigenschaft des TabControls beim "Remove" Aufruf setzt.
    Und zwar entfernter Index -1.
    Und genau das will ich nicht!!!
    Da ich genau die TabPage anzeigen will die auch vor dem entfernen sichtbar war. Um die Sicherheit, daß die zu entfernende TabPage auch die gerade sichtbare ist, würde ich mich dann schon kümmern.

    Lösungsversuche:
    Da die "SelectedIndex" Eigenschaft nicht als virtual deklariert ist, ist die Überschreibung nicht möglich.
    Eine Idee die mich lange Zeit (unnötig) gekostet hat, war:
    Eine Klasse von TabPageCollection abzuleiten und diese dann zum deklarieren der "TabPages" Eigenschaft der "TabControl" Klasse zu verwenden. Dabei hab ich versucht die "Remove" bzw. "RemoveTabPage" Eigenschaft zu überschreiben. Wie gesagt leider ohne Erfolg, da nötige parameter als internal deklariert sind und mir der Zugriff verweigert wurde!

    Würde mich über einen Lösungsansatz freuen!
    Danke für Eure Zeit!

    Martin
    Grüße,

    Martin

  • #2
    Hallo Martin,

    Lutz Roeder zeigt aber deutlich, dass er nur den SelectedIndex des Besitzers ändert, wenn die zu löschende Seite gerade indiziert ist:

    Code:
                If (index = selectedIndex) Then
                    Me.owner.SelectedIndex = 0
                End If
    Also das kann das Flickern eigentlich nicht sein.

    Tipp: Vielleicht hilft ein "SuspendLayout()" und ein "ResumeLayout()" bei dem Tab-Control während Deiner Aktionen in Deiner Invisible-Routine?

    Viele Grüße
    _ntr_

    Comment


    • #3
      Hallo _ntr_,

      Leider nein.
      Der reflector hat dich (genau wie mich) zur falschen methode ge"linkt" (und zwar zu Control.ControlCollection).
      So sieht die methode der TabControl.ControlCollection aus:
      Code:
      public override void Remove(Control value)
      {    
          base.Remove(value);    
          if (value is TabPage)    
          {        
              int index = this.owner.FindTabPage((TabPage) value);        
              if (index != -1)  
             {
                  this.owner.RemoveTabPage(index);
                  this.owner.SelectedIndex = Math.Max(index - 1, 0);
              }
              this.owner.UpdateTabSelection(false);
          }
      }
      SuspendLayout hab ich auch schon versucht.

      Danke für deine Zeit!

      Martin
      Grüße,

      Martin

      Comment


      • #4
        Hallo Martin#,

        dann bist Du wahrscheinlich genauso weit (und verzweifelt) wie ich es einmal mit der ListBox war. Ich wollte partout eine Möglichkeit haben, dass ich extern mitbekomme (per event), wenn Items hinzugefügt/entfernt werden.

        Mein damaliges Fazit (weil Microsoft so toll ObjektOrientiert denkt):
        Ich habe eine komplett eigene Listbox Implementierung gemacht (also nur von Control geerbt), und mir dann natürlich auch eine eigene Collection-Klasse gebastelt.

        Schätzungsweise bleibt Die da auch nur der Weg der Selbstimplementierung

        Grüße
        _ntr_

        Comment


        • #5
          Ich glaube, wenn die Zeit es zulässt, werde ich wirklich eine UserTabControl von Control ebene neu erstellen.
          Ich hette hald gehofft, mit einem Trick weiterzukommen!

          Trotzdem, danke für deine Zeit!
          Liebe Grüße,

          Martin
          Grüße,

          Martin

          Comment

          Working...
          X