Newsgroup: it.comp.lang.visual-basic
Titolo: Gestire alcuni eventi MouseDown MouseMove e MouseLeave dimanicamente

Salve vorrei sapere se qualche d'uno mi puo aitare:
per creare un evento su piu controlli inseriti in un panel dimanicamente
Vi Inserisco il codice cosi forse e piu chiaro
------------------------
ho Un form chiamato Form1
all'interno di questo Form ho inserito un Panel (panel1)
adesso ho creato un file classe
dove ho inserito del codice per creare all'interno del panel1
alti panel in modo dinamico:
ecco il codice:
------
Public Class Class1
    Public TagIndex As Integer ' gestisce l'indice deipannelli nella 
propieta tAG
    Dim HScarto As Integer = 5
    Dim HPanel As Integer = 30
    Dim Htemp As Integer = 0
    '-----
    Dim NewPanle As New Panel
    '----
    Sub New()
        For i = 0 To 5
            '---------
            If i = 0 Then
                Htemp = HScarto
            Else
                Htemp = Htemp + HPanel + HScarto
            End If
            '--------- Aggiungiamo il PannelloGriglia al PannelloForm
            NewPanle = DirectCast(CreaControlliPanel(Htemp, i + 1), Panel)
            Form1.Panel1.Controls.Add(NewPanle)
            AddHandler NewPanle.MouseDown, AddressOf MyEventMouseDown
            AddHandler NewPanle.MouseMove, AddressOf MyEventMouseMove
            AddHandler NewPanle.MouseLeave, AddressOf MyEventMouseLeave
            '---------MyEventMouseLeave
        Next
    End Sub
    '----
     Function CreaControlliPanel(ByVal HLocPanel As Integer, ByVal Index As 
Integer) As Panel
        '---- 
        Dim PnlGriglia As New Panel
        Dim LblIndex As New Label
        Dim LblImg As New Label
        Dim LblTitleKey, LblKeyFrn As New Label
        Dim LblTitleNomeForn, LblNomeForn As New Label
        Dim LblCatMerci As New Label
        '************ Creo il Pannello Griglia
        PnlGriglia.Location = New Point(5, HLocPanel) ' HlocPanel serve per 
posizionare un panel sotto l'atro
        PnlGriglia.Size = New Size(600, 33) '562
        PnlGriglia.BorderStyle = BorderStyle.FixedSingle
        PnlGriglia.Tag = Index
        '************* Creo degli Elementi da inserire nel pannello
        '---- Creo un Label Index
        With LblIndex
            .Location = New Point(0, 0)
            .Size = New Size(34, 31)
            .TextAlign = ContentAlignment.MiddleCenter
            .Text = Index
            .Tag = Index
            '.BorderStyle = BorderStyle.FixedSingle
            '---
            AddHandler .MouseDown, AddressOf MyEventMouseDown
            'AddHandler .MouseMove, AddressOf MyEventMouseMove
            'AddHandler .MouseLeave, AddressOf MyEventMouseLeave
            '---
        End With
        '---- creo un Label Nome
        With LblTitleNomeForn
            .Location = New Point(176, 16)
            .Size = New Size(75, 15)
            .TextAlign = ContentAlignment.MiddleLeft
            .Text = "Rag.Sociale:"
            .Tag = Index
            '.BorderStyle = BorderStyle.FixedSingle
            AddHandler .MouseDown, AddressOf MyEventMouseDown
            'AddHandler .MouseMove, AddressOf MyEventMouseMove
            'AddHandler .MouseLeave, AddressOf MyEventMouseLeave
        End With
        '************ Aggiungiamo i Controlli Sul Pannello Griglia
        With PnlGriglia.Controls
            .Add(LblIndex)
            .Add(LblTitleNomeForn)
        End With
        '-------
        Return PnlGriglia
        '-------
    End Function
    '*********************** Qui Gestisco gli eventi
    Private Sub MyEventMouseLeave(ByVal sender As Object, ByVal e As 
System.EventArgs)
        '------------
        Dim pannello As Panel
        pannello = DirectCast(sender, Panel)
        '------------
        If TagIndex = pannello.Tag Then
            Exit Sub
        End If
        pannello.BackColor = Color.White
        '------------
    End Sub
    Private Sub MyEventMouseMove(ByVal sender As Object, ByVal e As 
System.EventArgs)
        '-----------
        Dim pannello As Panel
        pannello = DirectCast(sender, Panel)
        If TagIndex = pannello.Tag Then
            Exit Sub
        End If
        pannello.BackColor = Color.HotPink
        '-------------
    End Sub
    Private Sub MyEventMouseDown(ByVal sender As Object, ByVal e As 
System.EventArgs)
        '----------- Prendi i dati dal form
        'Dim pannello As Panel
        'pannello = DirectCast(sender, Panel)
        '-------
        'TagIndex = pannello.Tag
        '-------
        'UnSelect()
        '----------
        'pannello.BackColor = Color.Blue
        '-----------
    End Sub
    Sub UnSelect()
        '---------' Deseleziona tutta la griglia formata da pannelli
        For Each pannello In Form1.Panel1.Controls
            If TypeOf pannello Is Panel Then
                pannello.BackColor = Color.White
            End If
        Next
    End Sub
End Class
--------------------
Adesso il problema che ho e che riesco a gestire gli eventi dei pannel
pero ho difficolta a gestire gli eventi dei controlli all'interno dei panel 
creati:
Se non sono stato sufficientemente chiaro chiedete pure.
Grazie 

 creati:
Prima le cose generiche, che non sono la causa diretta dell'errore:
- Non dovresti usare espressamente il nome di form e del pannello nel
codice della classe, perchè allora tanto valeva scrivere il codice
direttamente nella Form, così com'è non lo puoi riutilizzare comunque
da nessun altra parte
- Quando vuoi definire una routine che possa essere un gestore di
evento, la firma deve essere congruente con quella dell'evento
originale. La firma dell'evento MouseMove dell'oggetto Control, da cui
derivano i tuoi controlli, è:
MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs)
la tua invece
MyEventMouseMove(ByVal sender As Object, ByVal e As System.EventArgs)
ora, dato che MouseEventArgs deriva da EventArgs il compilatore la
accetta comunque, però ti perdi tutti i dettagli sullo stato del mouse
senza motivo
- Per ottenere l'effetto che vuoi, sarebbe meglio utilizzare MouseEnter
\MouseLeave e non MouseMove\MouseLeave, dato che ti interessa solo
apere quando ti sposti da un pannello all'altro, e non quando ti muovi
dentro lo stesso pannello.
- Una versione più semplice di quello che vuoi fare sarebbe quella di
agganciare solo l'evento del panel "Griglia" e all'interno dello
stesso, fare un ciclo sulla collection controls cambiando quindi
BackColor anche ai figli.
- Una versione ancora più semplice, se si parla solo di Label, è
quella di metterle con sfondo trasparente.
Veniamo al problema vero e proprio:
Stai utilizzando per il panel e per i controlli in esso contenuti gli
stessi handler di evento; questo di per se va bene, fintanto che i
vari eventi hanno la stessa firma, e in questo caso è così perchè come
detto prima, implementano tutti Control.MouseMove/Leave/Down... il
problema è che tu, nelle routine, usi:
      Dim pannello As Panel
      pannello = DirectCast(sender, Panel)
questo è sbagliato, perchè "sender" rappresenta proprio l'oggetto che
ha scatenato questa istanza di evento, e per come li stai usando tu,
può essere sia un Panel che una Label; nel secondo caso, giustamente,
ti spara fuori con un eccezione di cast invalido.
Quindi, o distingui prima il tipo di 'sender' e fai il cast
appropriato (If TypeOf sender is Panel.... ElseIf TypeOf sender is
Label ecc..), oppure visto che nel tuo caso il codice lavora su membri
che sono comuni a tutti glui oggetti derivati da Control (BackColor)
fai un cast al tipo base:
      Dim c As Control
      c = DirectCast(sender, Control)
      c.BackColor = xxx

Grazie delle Informazioni che mi hai dato
sono alle prime armi con il codice
Vorrei sapere se mi potresti fare un piccolo esempio di codice funzionante
magari modificando il mio postato oppure fai tu perche
hai compreso bene cio che voglio fare:
Grazie 

On 8 Apr, 16:30, "Cosimo De Crescenzo"

Guarda, se prendi le ultime tre righe del mio messaggio e le usi nelle
3 tue funzioni "MyEventXXX" al posto del cast a Panel, sostanzialmente
hai già qualcosa di funzionante.

 ha scritto nel messaggio 
news:61ab15f6-3758-46cc...@r37g2000yqn.googlegroups.com...


 Grazie
Non devi usare un' altra funzione, indendevo dire che il parametro
corretto di MyEventMouseMove, per essere fatta a immagine dell'evento
MouseMove che vuoi gestire, è di tipo MouseEventArgs, quindi diventa
MyEventMouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs)