Events von Eigenem Control werden nicht getriggert

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von mcdt.

    Events von Eigenem Control werden nicht getriggert

    Hi,

    ich habe ein eigenes control erstellt, auf dem während der Laufzeit Labels hinzugefügt werden können.
    Das funktioniert auch alles bestens.

    Jetzt möchte ich das Control "bewegen" - Das klappt auch, allerdings nur bedingt.
    Bewegt wird das Control indem ich im Control_MouseDown / Control_MouseUp Event die neue Position des Controls festlege. Das klappt allerdings nur solange nicht auf ein erstelltes Label des Controls klicke, sondern nur wenn auf den "Hintergrund" des Controls geklickt wird.

    Dann dachte ich mir, "schleife" ich jedes Event weiter, indem ich im Control jedem erstelltem label mittels Addhandler eine Routine bei allen "labels-Events" zuweise, also Label.MouseDown / Label.MouseUp und in den entsprechenden Routinen ein eigenes Event triggere mittels RaiseEvent MeinLabel_MouseDown / MeinLabel_MouseUp.

    Dann habe ich die "eigenen" Label Events in meinem Programm auch wieder mittels AddHandler der Selben Routine zuweise wie die Control_MouseDown / Control_MouseUp Events.

    Zu Testzwecken habe ich mir eine Debug Ausgabe gemacht.

    Jetzt ist es so das die Events beim Ziehen des Controls nicht getriggert werden wenn auf ein Label geklickt wird, denn es kommt weder eine Debug Ausgabe, noch wird das Control bewegt.

    Kann mir jemand sagen wie ich das Problem umgehen / beseitigen kann ?



    mfg
    Hi,

    mach ich das nicht mit folgendem Code ?

    Im Control:

    VB.NET-Quellcode

    1. ...
    2. Event LabelMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    3. Event LabelMouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    4. Event LabelMouseClick(ByVal sender As Object, ByVal e As System.EventArgs)
    5. Event LabelMouseDoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
    6. ...



    Immernoch im Control an der Stelle wo die Labels erstellt werden:

    VB.NET-Quellcode

    1. ...
    2. AddHandler lbl.MouseDown, AddressOf LabelMouseDown_Event
    3. AddHandler lbl.MouseUp, AddressOf LabelMouseUp_Event
    4. AddHandler lbl.Click, AddressOf LabelMouseClick_Event
    5. AddHandler lbl.DoubleClick, AddressOf LabelMouseDoubleClick_Event
    6. Me.Controls.Add(lbl)
    7. ...



    Immernoch im Control der Aufruf der Evenst:

    VB.NET-Quellcode

    1. ...
    2. Sub LabelMouseDown_Event(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    3. RaiseEvent LabelMouseDown(sender, e)
    4. End Sub
    5. Sub LabelMouseUp_Event(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    6. RaiseEvent LabelMouseUp(sender, e)
    7. End Sub
    8. Sub LabelMouseClick_Event(ByVal sender As Object, ByVal e As System.EventArgs)
    9. RaiseEvent LabelMouseClick(sender, e)
    10. End Sub
    11. Sub LabelMouseDoubleClick_Event(ByVal sender As Object, ByVal e As System.EventArgs)
    12. RaiseEvent LabelMouseDoubleClick(sender, e)
    13. End Sub
    14. ...




    Im Code wo das Control erstellt wird:

    VB.NET-Quellcode

    1. ...
    2. '"orginal" Events des Controls
    3. AddHandler Control.MouseDown, AddressOf Control_MouseDown
    4. AddHandler Control.MouseUp, AddressOf Control_MouseUp
    5. AddHandler Control.Click, AddressOf Control_MouseClick
    6. AddHandler Control.DoubleClick, AddressOf Control_MouseDoubleClick
    7. 'selbst erstellte Events (der Labels)
    8. AddHandler Control.LabelMouseDown, AddressOf Control_MouseDown
    9. AddHandler Control.LabelMouseUp, AddressOf Control_MouseUp
    10. AddHandler Control.LabelMouseClick, AddressOf Control_MouseClick
    11. AddHandler Control.LabelMouseDoubleClick, AddressOf Control_MouseDoubleClick
    12. ...
    ja, hab ich beim editieren fälschlicherweise falsch benannt.

    Aber ich habe mir deinen verlinkten Beitrag mal angesehen und ein Kleines Testprojekt erstellt.
    Es scheint das die Methode mit dem Eventhandler mein Problem löst.

    Jetzt bekomme ich beim Klick auf ein Label auch die events getriggert.

    Anbei mal der Beispiel Code:

    Control:

    VB.NET-Quellcode

    1. ...
    2. Public Class UserControl1
    3. Event LabelEventHandler As EventHandler
    4. Private Sub Label1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseClick
    5. RaiseEvent LabelEventHandler(sender, e)
    6. End Sub
    7. Private Sub Label1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDoubleClick
    8. RaiseEvent LabelEventHandler(sender, e)
    9. End Sub
    10. Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
    11. RaiseEvent LabelEventHandler(sender, e)
    12. End Sub
    13. Private Sub Label1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseUp
    14. RaiseEvent LabelEventHandler(sender, e)
    15. End Sub
    16. End Class
    17. ...



    Form:

    VB.NET-Quellcode

    1. ...
    2. Option Explicit On
    3. Option Strict On
    4. Imports TestControl
    5. Public Class Form1
    6. Sub LabelEvents(ByVal sender As System.Object, ByVal e As System.EventArgs)
    7. MsgBox(sender.ToString & vbCrLf & e.GetType.ToString & vbCrLf & e.ToString)
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. Dim uc As New UserControl1
    11. AddHandler uc.LabelEventHandler, AddressOf LabelEvents
    12. uc.Location = New Point(CInt(Me.Width / 2), CInt(Me.Height / 2))
    13. Me.Controls.Add(uc)
    14. End Sub
    15. End Class
    16. ...



    Jetzt werde ich mir für jedes Event (MouseDown,...) einen eigenen Eventhandler erstellen und darüber die jeweiligen Events bekommen.


    Besten Dank!!!