Click here to Skip to main content
15,885,045 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
At first : I develop a Windows.Forms-Application (.Net 4.0)

My Problem is a bit difficil to explain :

I have a custom Control which creates dynamicly Sub-Controls (like Labels) in it. From each Label I take some Event-Handlers as for example MouseEnter or MouseLeave to a common Sub which delivers this Event for the complete Control and gives as Sender the responsible sub-Control.
This part is working fine ...

Now I put this Control in a customized collection which also has to catch this Event and deliver it to outside the collection.
This part is working if I use Labels or Buttons as Elements of this collection - but it isn't working with the described "Custom"-Control.

If nescessary I would post a part of my Code - but I Think, that the nature of the "Problem" is something basicly.

Edited :

Code-Snippets from the described "Problem" :

This part collects the Event-Handler inside the Custom Control :
VB
Private KalenderElemente As New Collection

Private Sub CreateElements()

    KalenderElemente.Clear()

    For i As Integer = 1 To 42
        Dim myKalenderTag As New PP_Monatskalender_Tag
        myKalenderTag.Name = "Tag_" + i.ToString("00")
        myKalenderTag.ForeColor = my_ForeColor_Days
        myKalenderTag.BackColor = my_BackColor_Days
        myKalenderTag.Parent = Me

        AddHandler myKalenderTag.Click, AddressOf KalenderTag_Click
        AddHandler myKalenderTag.MouseMove, AddressOf KalenderTag_MouseMove
        AddHandler myKalenderTag.MouseEnter, AddressOf KalenderTag_MouseEnter
        AddHandler myKalenderTag.MouseLeave, AddressOf KalenderTag_MouseLeave

        KalenderElemente.Add(myKalenderTag)
     Next

End Sub



Private Sub Kalender_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
    If Not KalenderElemente.Item(0).Visible Then
        KalenderElemente.Item(0).DatumsTag = 0
        RaiseEvent MouseMove(KalenderElemente.Item(0), e)
    Else
        KalenderElemente.Item(41).DatumsTag = 0
        RaiseEvent MouseMove(KalenderElemente.Item(41), e)
    End If
End Sub

Private Sub KalenderTag_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
    RaiseEvent MouseMove(sender, e)
End Sub

Shadows Event MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)

Private Sub KalenderTag_MouseEnter(ByVal sender As Object, ByVal e As EventArgs)
    RaiseEvent MouseEnter(sender, e)
End Sub

Shadows Event MouseEnter(ByVal sender As Object, ByVal e As EventArgs)

Private Sub KalenderTag_MouseLeave(ByVal sender As Object, ByVal e As EventArgs)
    RaiseEvent MouseLeave(sender, e)
End Sub

Shadows Event MouseLeave(ByVal sender As Object, ByVal e As EventArgs)


Now each of the internal Controls deliver it's Mouse-Event to outside.
If I put it on a Form and write a script which takes the Event I could see that all works fine (and as expected).

In the following you see the part of the collection which should manage this Control (and others) :
VB
Public Class MessageDefinition

    Public WithEvents Control As Control
    Public HeaderText As String
    Public MessageText As String
    Public DisplayShadow As Boolean
    Public ToolTipLocation As ToolTipLocationDefintion
    Public Location As Point

End Class

Public Class Message_Collection
    Inherits CollectionBase

    Public Shadows Sub Clear()

        Dim myItem As MessageDefinition

        For i As Integer = 1 To List.Count
            myItem = List.Item(i - 1)
            RemoveHandler myItem.Control.MouseEnter, AddressOf Item_MouseEnter
            RemoveHandler myItem.Control.MouseMove, AddressOf Item_MouseMove
            RemoveHandler myItem.Control.MouseLeave, AddressOf Item_MouseLeave
        Next

        List.Clear()
    End Sub

    Overrides Function ToString() As String
        Return "[...]"
    End Function

    Public Sub Dispose()
        Clear()
    End Sub

    ' ================================

    Public Sub SetMessage(item As MessageDefinition)

        Dim myItem As MessageDefinition

        For i As Integer = 1 To List.Count
            myItem = List.Item(i - 1)
            If myItem.Control.GetType Is item.Control.GetType _
            AndAlso myItem.Control.Name = item.Control.Name Then
                'List.Item(i - 1) = item
                'RaiseEvent MouseEnter(item, System.EventArgs.Empty)
                Exit Sub
            End If
        Next

        AddHandler item.Control.MouseEnter, AddressOf Item_MouseEnter
        AddHandler item.Control.MouseMove, AddressOf Item_MouseMove
        AddHandler item.Control.MouseLeave, AddressOf Item_MouseLeave
        List.Add(item)
        RaiseEvent MouseEnter(item, System.EventArgs.Empty)
    End Sub

    Private Sub Item_MouseEnter(sender As Object, e As System.EventArgs)

        Dim myItem As MessageDefinition
        Dim mySender As Control = sender

        For i As Integer = 1 To List.Count
            myItem = List.Item(i - 1)
            If myItem.Control Is mySender Then
                RaiseEvent MouseEnter(myItem, e)
                Exit Sub
            End If
        Next

    End Sub

    Private Sub Item_MouseMove(sender As Object, e As System.EventArgs)

        Dim myItem As MessageDefinition
        Dim mySender As Control = sender

        For i As Integer = 1 To List.Count
            myItem = List.Item(i - 1)
            If myItem.Control Is mySender Then
                RaiseEvent MouseMove(myItem, e)
                Exit Sub
            End If
        Next

    End Sub

    Private Sub Item_MouseLeave(sender As Object, e As System.EventArgs)

        Dim myItem As MessageDefinition
        Dim mySender As Control = sender

        For i As Integer = 1 To List.Count
            myItem = List.Item(i - 1)
            If myItem.Control Is mySender Then
                RaiseEvent MouseLeave(myItem, e)
                Exit Sub
            End If
        Next

    End Sub

    Public Event MouseEnter(sender As Object, e As System.EventArgs)
    Public Event MouseMove(sender As Object, e As System.EventArgs)
    Public Event MouseLeave(sender As Object, e As System.EventArgs)

End Class

As describe (on Top) the catched Events are fired with "Standard"-Controls but not with the "Customized" Control.
Posted
Updated 18-May-15 18:57pm
v2
Comments
virusstorm 18-May-15 15:05pm    
Please post sample code so we can help you.
Ralf Meier 19-May-15 0:58am    
OK ... work is done.
I hope you can do something with this code-parts ... ;)
Ralf Meier 19-May-15 7:00am    
After some further tests with the Code I have the following oppinion :
Inside my Custom-Control I make a Shadowing over the Events, derived from the inherited object. I could imagine, that the shadowing does not work in every case - is that possible ?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900