none
Eigenes TabControl RRS feed

  • Frage

  • Hallo zusammen

    Ich möchte ein eigenes TabControl haben, welches die einzelnen TabPages blau statt weiss bringt. Eigentlich ist es ganz einfach. Ich brauche nur die Hintergrundfarbe jedes TabControl zu ändern und schon habe ich das was ich wollte. Nun möchte ich aber ein eigenes TabControl machen, welches die TabPage Standardmässig blau hat. Dabei soll es sich zur Entwurfszeit gleich verhalten wie das normale TabControl.

    So wie ich das sehe, muss ich folgendes überschriben:

    • TabControl
    • TabControl.TabPageCollection
    • TabPage

    Das habe ich versucht. Leider enthält nun mein TabControl je 2 TabPage. 2 TabPage vom uhrprünglichen TabControl und 2 TapPage von meinem TabControl.

    So wie ich das sehe ist das nicht ganz so einfach mit dem TabControl. Weiss jemand wie man das richtig überschreibt??

    Gruss Marcel

    Freitag, 17. September 2010 08:17

Antworten

  • Hallo Marcel,

    Ich möchte ein eigenes TabControl haben, welches die einzelnen TabPages blau statt weiss bringt. Eigentlich ist es ganz einfach. Ich brauche nur die Hintergrundfarbe jedes TabControl zu ändern und schon habe ich das was ich wollte. Nun möchte ich aber ein eigenes TabControl machen, welches die TabPage Standardmässig blau hat. Dabei soll es sich zur Entwurfszeit gleich verhalten wie das normale TabControl.

    wenn Du Dir nicht viel Arbeit damit machen möchtest, kannst Du die OnControlAdded Methode überschreiben und dort die Stanadardfarbe für die eingefügten TabPages festlegen:

    Public Class MyTab
     Inherits TabControl
    
     Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
      If TypeOf e.Control Is TabPage Then
       DirectCast(e.Control, TabPage).BackColor = Color.Blue
      End If
    
      MyBase.OnControlAdded(e)
     End Sub
    End Class
    

    Wenn generell keine andere Hintergrundfarbe gesetzt werden soll, kann man auch noch auf das BackColorChanged Ereignis reagieren:

    Public Class MyTab
     Inherits TabControl
    
     Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
      If TypeOf e.Control Is TabPage Then
       Dim lTab As TabPage = DirectCast(e.Control, TabPage)
       lTab.BackColor = Color.Blue
    
       AddHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
      End If
    
      MyBase.OnControlAdded(e)
     End Sub
    
     Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs)
      If TypeOf e.Control Is TabPage Then
       Dim lTab As TabPage = DirectCast(e.Control, TabPage)
    
       RemoveHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
      End If
    
      MyBase.OnControlRemoved(e)
     End Sub
    
     Private Sub TabBackColorChanged(ByVal sender As Object, ByVal e As EventArgs)
      Dim lTab As TabPage = DirectCast(sender, TabPage)
    
      RemoveHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
      lTab.BackColor = Color.Blue
      AddHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
     End Sub
    
    End Class
    

    Das als pragmatischer Ansatz, da Du uns Deinen nicht verraten hast.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 17. September 2010 08:43
    Moderator

Alle Antworten

  • Hallo Marcel,

    Ich möchte ein eigenes TabControl haben, welches die einzelnen TabPages blau statt weiss bringt. Eigentlich ist es ganz einfach. Ich brauche nur die Hintergrundfarbe jedes TabControl zu ändern und schon habe ich das was ich wollte. Nun möchte ich aber ein eigenes TabControl machen, welches die TabPage Standardmässig blau hat. Dabei soll es sich zur Entwurfszeit gleich verhalten wie das normale TabControl.

    wenn Du Dir nicht viel Arbeit damit machen möchtest, kannst Du die OnControlAdded Methode überschreiben und dort die Stanadardfarbe für die eingefügten TabPages festlegen:

    Public Class MyTab
     Inherits TabControl
    
     Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
      If TypeOf e.Control Is TabPage Then
       DirectCast(e.Control, TabPage).BackColor = Color.Blue
      End If
    
      MyBase.OnControlAdded(e)
     End Sub
    End Class
    

    Wenn generell keine andere Hintergrundfarbe gesetzt werden soll, kann man auch noch auf das BackColorChanged Ereignis reagieren:

    Public Class MyTab
     Inherits TabControl
    
     Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
      If TypeOf e.Control Is TabPage Then
       Dim lTab As TabPage = DirectCast(e.Control, TabPage)
       lTab.BackColor = Color.Blue
    
       AddHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
      End If
    
      MyBase.OnControlAdded(e)
     End Sub
    
     Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs)
      If TypeOf e.Control Is TabPage Then
       Dim lTab As TabPage = DirectCast(e.Control, TabPage)
    
       RemoveHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
      End If
    
      MyBase.OnControlRemoved(e)
     End Sub
    
     Private Sub TabBackColorChanged(ByVal sender As Object, ByVal e As EventArgs)
      Dim lTab As TabPage = DirectCast(sender, TabPage)
    
      RemoveHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
      lTab.BackColor = Color.Blue
      AddHandler lTab.BackColorChanged, AddressOf TabBackColorChanged
     End Sub
    
    End Class
    

    Das als pragmatischer Ansatz, da Du uns Deinen nicht verraten hast.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 17. September 2010 08:43
    Moderator
  • Hallo Thorsten

    Genau eine so einfache Lösung habe ich gesucht. Nur leider funktioniert bei mir dies nicht. Wenn ich meine TabPage auf ein Fenster ziehe sind die beiden vorhandenen TapPage immer noch Transparent. Auch die neuen TapPage die ich dann in den Eigenschaften zufüge sind Transparent.

    Im Moment sieht die Klasse so aus:

    Imports System.Drawing

    <ToolboxBitmap(GetType(System.Windows.Forms.TabControl))> _
    Public Class TabControl
        Inherits System.Windows.Forms.TabControl

    #Region "Methoden"
        Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
            If TypeOf e.Control Is TabPage Then
                DirectCast(e.Control, TabPage).BackColor = Color.FromArgb(216, 228, 243)
            End If
            MyBase.OnControlAdded(e)
        End Sub
    #End Region
    End Class

    Die Klasse ist in einem anderen Namespace und darf aus diesen Grund gleich hiessen. Muss ich noch eine andere Methode überschrieben ??

    Gruss Marcel

    Freitag, 17. September 2010 09:29
  • Hallo Thorsten

    Es geht doch. Ich musste nur VisualStudio schliessen und neu starten. Nun geht es. War wohl noch irgendwie etwas im Cash.

    Danke viel mal. Einfach und genial!

    Gruss Marcel

    Freitag, 17. September 2010 09:36