Designer ändert Property bei eigenem Control nicht

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Top-Secret-Programs.

    Designer ändert Property bei eigenem Control nicht

    Jo, ich bins wieder. :)

    Diesesmal gehts mir um ein eigenes Control.
    Dieses hat die Eigenschaft "ControlText As String". Ich kann diese Eigenschaft im Designer ändern, klappt auch alles ganz gut. Wenn ich das Programm dann allerdings starte ist die Eigenschaft wieder der Standart, sprich ein Leerstring, obwohl sie im Designer eigentlich etwas anderes ist(z.B. "Hallo Welt" ^^).
    Wie mache ich es, dass der Designer die Propertys setzt, und dass diese im Programm dann schon gesetzt sind?
    Hier mal der Code:

    VB.NET-Quellcode

    1. Public Class ColoredLabel
    2. Private myText As String = ""
    3. Private myFont As Font = New Font("Microsoft Sans Serif", 8.75!)
    4. Private myFontColor As Color = Color.Black
    5. <System.ComponentModel.Browsable(True)> _
    6. Public Overrides Property Text() As String
    7. Get
    8. Return myText
    9. End Get
    10. Set(ByVal value As String)
    11. myText = value
    12. DrawText(myText)
    13. End Set
    14. End Property
    15. Private Sub DrawText(ByVal Text As String)
    16. Dim g As Graphics = Me.CreateGraphics
    17. g.DrawString(Text, myFont, New SolidBrush(myFontColor), Me.ClientRectangle)
    18. End Sub
    19. End Class
    Pack die Initialisierung in den Konstruktor:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.Drawing
    3. Public Class ColoredLabel
    4. Inherits Label
    5. Private myText As String
    6. Private myFont As Font
    7. Private myFontColor As Color
    8. Public Sub New()
    9. myText = ""
    10. myFont = New Font("Microsoft Sans Serif", 8.75!)
    11. myFontColor = Color.Black
    12. End Sub
    13. <System.ComponentModel.Browsable(True)> _
    14. Public Overrides Property Text() As String
    15. Get
    16. Return myText
    17. End Get
    18. Set(ByVal value As String)
    19. myText = value
    20. DrawText(myText)
    21. End Set
    22. End Property
    23. Private Sub DrawText(ByVal Text As String)
    24. Dim g As Graphics = Me.CreateGraphics
    25. g.DrawString(Text, myFont, New SolidBrush(myFontColor), Me.ClientRectangle)
    26. End Sub
    27. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das hat leider auch nichts geändert. Der Text wird beim Programmstart immer noch als Leerstring angezeigt.
    Ich habe die Vermutung, dass der Text, der im Designer auch gemalt wird (!) gar nicht im Code "ankommt". Kann das sein? Und wenn ja, wie kann ich das ändern? Im Designer wird der Text ja richtig gemalt. Wenn ich ihn über den Code ändere wird er auch angezeigt. Nur eben beim Start nicht.
    Außerdem habe ich es jetzt noch mit Breakpoints probiert, diese zeigen auch an, dass die Variable myText beim Start immer einen Leerstring erhält.
    Bei mir läuft das:
    Bilder
    • Control.jpg

      12,44 kB, 406×400, 141 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Keine Ahnung.
    Ich habe Deinen Code bei mir eingefügt und ihn dann zum Laufen gebracht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    klar das es bei dir funktioniert du verwendest Inherits label somit wird bei dir auch nichts gezeichnet sondern die standardeigenschaft Text des label verwendet er hat aber ein usercontrol

    VB.NET-Quellcode

    1. Private myText As String = ""
    2. Private myFont As Font = New Font("Microsoft Sans Serif", 8.75!)
    3. Private myFontColor As Color = Color.Black
    4. <System.ComponentModel.Browsable(True)> _
    5. Public Overridable Property Text() As String
    6. Get
    7. Return myText
    8. End Get
    9. Set(ByVal value As String)
    10. myText = value
    11. DrawText(myText)
    12. End Set
    13. End Property
    14. Private Sub DrawText(ByVal Text As String)
    15. Dim b As New Bitmap(Me.Width, Me.Height)
    16. Dim g As Graphics = Graphics.FromImage(b)
    17. g.DrawString(Text, myFont, New SolidBrush(myFontColor), Me.ClientRectangle)
    18. Me.BackgroundImage = b
    19. End Sub


    Overrides in Overridable
    DrawText angepasst
    Nun - mein Code ist ein von Label abgeleitetes UserControl.
    Seins ist halt irgend etwas, das keinen Text ausgibt.
    Aber so geht es:

    VB.NET-Quellcode

    1. Public Property _MyText() As String
    2. Private Sub UserControl1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    3. Dim g As Graphics = e.Graphics
    4. g.DrawString(_MyText, myFont, New SolidBrush(myFontColor), New Point(10, 10))
    5. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Doch, wenn Du mein erstes Beispiel nimmst und auf ein explizites UserControl verzichtest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!