Benutzersteuerelement Checkbox

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Benutzersteuerelement Checkbox

    Hallo,
    ich habe 2 Probleme mit einer von mir erstellten Checkbox. Zuerst mal mein bisheriger Code.

    VB.NET-Quellcode

    1. Public Class PitCheckBox
    2. Public Event PitClick(ByVal sender As Object, ByVal e As Checked_Event)
    3. Private Infotext As String
    4. Private Infoimage As Image
    5. Public Class Checked_Event
    6. Inherits EventArgs
    7. Public Checked As Boolean
    8. Public Enum EventResult
    9. [False]
    10. [True]
    11. End Enum
    12. Public Sub New(ByVal Status As EventResult)
    13. Checked = Status
    14. End Sub
    15. End Class
    16. Property PitText() As String
    17. Get
    18. Return Infotext
    19. End Get
    20. Set(ByVal value As String)
    21. Infotext = value
    22. Info.Text = Infotext
    23. End Set
    24. End Property
    25. Property PitImage() As Image
    26. Get
    27. Return Infoimage
    28. End Get
    29. Set(ByVal value As Image)
    30. Infoimage = value
    31. I1.Image = Infoimage
    32. End Set
    33. End Property
    34. Private Sub St1_Click(sender As Object, e As EventArgs) Handles St1.Click
    35. If St1.Tag = False Then
    36. St1.Tag = True
    37. St1.Image = My.Resources._ON
    38. RaiseEvent PitClick(Me, New Checked_Event(Checked_Event.EventResult.True))
    39. ElseIf St1.Tag = True Then
    40. St1.Tag = False
    41. St1.Image = My.Resources.OFF
    42. RaiseEvent PitClick(Me, New Checked_Event(Checked_Event.EventResult.False))
    43. End If
    44. End Sub
    45. Private Sub PitCheckBox_Load(sender As Object, e As EventArgs) Handles Me.Load
    46. St1.Image = My.Resources.OFF
    47. St1.Tag = False
    48. End Sub
    49. End Class


    Soweit funktioniert auch alles nur wenn ich mein steuerelement auf die form ziehe und Checked abrufe kann ich das auch so machen.

    VB.NET-Quellcode

    1. Private Sub PitCheckBox1_PitClick(sender As Object, e As PitCheckBox.Checked_Event) Handles PitCheckBox1.PitClick
    2. If e.Checked = True Then
    3. MsgBox("True")
    4. ElseIf e.Checked = False Then
    5. MsgBox("False")
    6. End If
    7. End Sub


    Das funktioniert auch. nur möchte ich es ändern das ich nicht

    VB.NET-Quellcode

    1. e.Checked
    sondern

    VB.NET-Quellcode

    1. PitCheckBox1.Checked
    verwenden kann. Denn mit e. kann ich ja auch nicht aus einem Button den Zustand ändern.

    Hoffe auf eure Hilfe.
    Und warum baust Du nicht einfach eine Public Property Checked As Boolean ein? Würde Dir auch (falls gewollt) die eigenen EventArgs ersparen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich weiß zwar nicht, von welcher Klasse Deine CheckBox erbt, aber wenn Du ihr neben Property PitText() As String und Co. eben eine Property namens Checked gibst, dann kannst Du diese doch genauso abfragen, wie Du es willst. Oder sehe ich da irgendeinen Fallstrick nicht, der diesen Weg unmöglich macht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou.
    @Toolmaster Warum erbst Du nicht gleich von CheckBox?
    Was kann Deine CheckBox, was die aus dem FrameWork nicht kann?
    Für checkState abhängige Bilder machst Du ne ImageList und weist bei CheckedChanged den entsprechenden Index zu.
    Vielleicht postest Du mal ein Bild pro Zustand von Deinem Control?
    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!
    Was kann Deine CheckBox, was die aus dem FrameWork nicht kann?


    Ich habe noch eine Info Picturebox neben dem Checkpicture. Sonst sieht Sie eigentlich gleich aus wie eine CheckBox, nur eben das ich kein Hackerl verwende sondern ein X.

    Ich weiß zwar nicht, von welcher Klasse Deine CheckBox erbt, aber wenn Du ihr neben Property PitText() As String und Co. eben eine Property namens Checked gibst, dann kannst Du diese doch genauso abfragen, wie Du es willst.


    Da bin ich gestern wirklich auf dem Schlauch gestanden. Funktioniert soweit.

    Nur ein Problem habe ich noch. Wenn ich eine Picturebox direckt auf der Form habe und die Bilder mit diesem Code wechsle.

    VB.NET-Quellcode

    1. Private Sub PitCheckBox_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. PictureBox1.Image = My.Resources.OFF
    3. PictureBox1.Tag = False
    4. End Sub
    5. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    6. If PictureBox1.Tag = False Then
    7. PictureBox1.Image = My.Resources._ON
    8. PictureBox1.Tag = True
    9. ElseIf PictureBox1.Tag = True Then
    10. PictureBox1.Image = My.Resources.OFF
    11. PictureBox1.Tag = False
    12. End If
    13. End Sub


    Macht es das zuverlässig und flink. Habe ich diesen Code aber im Benutzersteuerelement so wechselt das Image sehr träge und auch oft erst nach dem zweiten Click. Woran kann das liegen?
    1. Liegt nicht am gezeigten Code. Mit ihm läuft es so flink wie in dem Hauptform. Hätte mich auch gewundert, wenn es anders gewesen wäre => Es muss was anderes, bisher ungezeigtes sein. Oder verwendest Du noch zusätzlich den Code aus Post#1? Dann jenen erstmal komplett deaktivieren und Schritt für Schritt reaktivieren. Wenn's komisch läuft, hat es was mit dem EventRaising zu tun.
    2. Option Strict On. PictureBox1.Tag = False: Da Tag vom Typ Object ist, ist der Vergleich mit einem Boolean ohne explizite Konvertierung nicht möglich.
    3. Statt Tag zu verwenden, wäre eine aussagekräftige Membervariable vom Typ Boolean sinnvoller.
    4. Die Zeilen #7 und #10 sind insofern ausbaufähig, da ein expliziter Vergleich mit True und False überflüssig sind. Wäre Tag vom Typ Boolean, würde folgendes reichen:

    VB.NET-Quellcode

    1. PictureBox1.Image = If(Tag, My.Resources._OFF, My.Resources._ON)
    2. Tag = Not Tag

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Toolmaster schrieb:

    sehr träge und auch oft erst nach dem zweiten Click. Woran kann das liegen?
    Verwende das CheckedChanged-Event.
    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!

    Toolmaster schrieb:

    Nur ein Problem habe ich noch.
    Ähm - imo hast du noch eine ganze Reihe Probleme, am problematischsten findich aber, dass du Fragen nicht beantwortest, und Sachverhalte nicht klärst, wenn sie angefragt werden:

    Toolmaster schrieb:

    Ich weiß zwar nicht, von welcher Klasse Deine CheckBox erbt, aber wenn Du ihr neben Property PitText() As String und Co. eben eine Property namens Checked gibst, dann kannst Du diese doch genauso abfragen, wie Du es willst.


    Da bin ich gestern wirklich auf dem Schlauch gestanden. Funktioniert soweit.
    Kannst du das erkennen, dass das keine Antwort auf die Frage ist?