Button führt Event bei Doppelklick nur einmal aus

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Sekki.

    Button führt Event bei Doppelklick nur einmal aus

    Guten Abend,

    Ich habe einen Button auf meiner Form, welcher ein normales Event ausführt (in dem Fall addiert er die Zahl +1 mit jedem Klick und wenn er bei 6 angekommen ist, stellt er sich automatisch wieder auf 0). Ja, ist nicht der beste Code, darum habe ich mich aber in der kurzen Zeit nicht sonderlich gekümmert. Jedenfalls führt der Button bei einem schnell Klick das Event nur einmal aus (obwohl man zweimal geklickt hat). Unten seht ihr ein GIF, wo man es super sieht. Während ich jedoch die Maus beim klicken bewege, wird akkurat bei jedem Klick auch das Event ausgeführt. Meine Vermutung ist, dass die Bewegung der Maus beim Control etwas updated, ich kann mir beim besten Willen jedoch nicht vorstellen, was es ist. Habt ihr da vielleicht eine Lösung?



    VB.NET-Quellcode

    1. Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click
    2. If btn.Text = 5 Then
    3. btn.Text = 0
    4. End If
    5. btn.Text += 1
    6. End Sub



    Button Control:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class VisualButton : Inherits Control
    2. #Region " Variables"
    3. Private W, H As Integer
    4. Private _Rounded As Boolean = False
    5. Private State As MouseState = MouseState.None
    6. Private _None As Image = Nothing
    7. Private _Over As Image = Nothing
    8. Private _Down As Image = Nothing
    9. #End Region
    10. #Region " Properties"
    11. #Region " Colors"
    12. <Category("Colors")>
    13. Public Property BaseColor As Color
    14. Get
    15. Return _BaseColor
    16. End Get
    17. Set(value As Color)
    18. _BaseColor = value
    19. End Set
    20. End Property
    21. <Category("Colors")>
    22. Public Property TextColor As Color
    23. Get
    24. Return _TextColor
    25. End Get
    26. Set(value As Color)
    27. _TextColor = value
    28. End Set
    29. End Property
    30. <Category("Options")>
    31. Public Property Rounded As Boolean
    32. Get
    33. Return _Rounded
    34. End Get
    35. Set(value As Boolean)
    36. _Rounded = value
    37. End Set
    38. End Property
    39. <Category("Visual")>
    40. Public Property Over As Image
    41. Get
    42. Return _Over
    43. End Get
    44. Set(value As Image)
    45. _Over = value
    46. End Set
    47. End Property
    48. <Category("Visual")>
    49. Public Property None As Image
    50. Get
    51. Return _None
    52. End Get
    53. Set(value As Image)
    54. _None = value
    55. End Set
    56. End Property
    57. <Category("Visual")>
    58. Public Property Down As Image
    59. Get
    60. Return _Down
    61. End Get
    62. Set(value As Image)
    63. _Down = value
    64. End Set
    65. End Property
    66. #End Region
    67. #Region " Mouse States"
    68. Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
    69. MyBase.OnMouseDown(e)
    70. State = MouseState.Down : Invalidate()
    71. End Sub
    72. Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
    73. MyBase.OnMouseUp(e)
    74. State = MouseState.Over : Invalidate()
    75. End Sub
    76. Protected Overrides Sub OnMouseEnter(e As EventArgs)
    77. MyBase.OnMouseEnter(e)
    78. State = MouseState.Over : Invalidate()
    79. End Sub
    80. Protected Overrides Sub OnMouseLeave(e As EventArgs)
    81. MyBase.OnMouseLeave(e)
    82. State = MouseState.None : Invalidate()
    83. End Sub
    84. #End Region
    85. #End Region
    86. #Region " Colors"
    87. Private _BaseColor As Color = _FlatColor
    88. Private _TextColor As Color = Color.FromArgb(243, 243, 243)
    89. #End Region
    90. Sub New()
    91. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or
    92. ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer Or
    93. ControlStyles.SupportsTransparentBackColor, True)
    94. DoubleBuffered = True
    95. Size = New Size(106, 25)
    96. BackColor = Color.Transparent
    97. Font = New Font("Segoe UI", 12)
    98. Cursor = Cursors.Hand
    99. BackgroundImage = _None
    100. End Sub
    101. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    102. B = New Bitmap(Width, Height) : G = Graphics.FromImage(B)
    103. W = Width - 1 : H = Height - 1
    104. Dim GP As New GraphicsPath
    105. Dim Base As New Rectangle(0, 2, W, H)
    106. With G
    107. .SmoothingMode = 2
    108. .PixelOffsetMode = 2
    109. .TextRenderingHint = 5
    110. .Clear(BackColor)
    111. Select Case State
    112. Case MouseState.None
    113. Me.BackgroundImage = _None
    114. Case MouseState.Over
    115. Me.BackgroundImage = _Over
    116. Case MouseState.Down
    117. Me.BackgroundImage = _Down
    118. End Select
    119. '-- Text
    120. .DrawString(Text, Font, New SolidBrush(_TextColor), Base, CenterSF)
    121. End With
    122. MyBase.OnPaint(e)
    123. G.Dispose()
    124. e.Graphics.InterpolationMode = 7
    125. e.Graphics.DrawImageUnscaled(B, 0, 0)
    126. B.Dispose()
    127. End Sub
    128. End Class
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    1. Bitte Option Strict On
    2. einfacher geht's mit x = (x Mod 5) + 1 <- korrigiert, da Du ja nicht bei Null anfangen willst ##########
    3. Zum Problem: Weil nicht nur das Click-, sondern in dem Fall wohl das DoubleClick-Event ausgelöst wird. Behandle also entsprechend jenen EventHandler mit x += 2 und Mod
    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.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    1.) Ich versuche es mir anzugewöhnen. Ich liebe den Luxus in Visual Basic, dass er mir alles korrekt konvertiert.

    2.) Mit Mod(ulo?) muss ich mich noch auseinander setzen, dachte mir aber dass es eine einfachere Lösung gibt. Danke, dass du den Code direkt verbessert hast.

    3.) Hat wunderbar funktioniert. Wahrscheinlich wird beim DoubleClick-Event nicht mehr der ClickEvent ausgeführt. Habe einfach das DoubleClick Event in die Handler reingepackt.

    Ich bedanke mich für die schnelle Antwort, wie immer. c:
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.