Evenements Usercontrol et collection d'objets

Résolu
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012
- 2 juin 2009 à 16:45
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012
- 3 juin 2009 à 14:58
Bonjour,

J'ai développé un usercontrol en vb dot net
Dans ma form principale je fais :

Private colUControl As New List(Of UControl)

Ainsi j'ai bien ma collection de UControl
Ensuite, chaque UControl contiennent l'event clickMiddle
Public Event clickMiddle()


Et appel fait via un raiseEvent clickMiddle()

mon soucis est que j'aimerais sur ma feuille utiliser cet event et ce pour chaque UControl.

J'ai tester des choses du genre :
Private WithEvents colUControl As New List(Of UControl )
Private WithEvents UControl
....


Mais ma migration de VB6 à Dot net m'est un peu difficile


Merci à vous
ABF

13 réponses

Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
3 juin 2009 à 13:54
Dans ton UC (partie déclarative):

Public Event ClickMiddle (sender As Object, e As System.EventArgs)

Dans la procédure qui lance l'évenement ClickMiddle
    
RaiseEvent ClickMiddle (Me, New System.EventArgs)

Dans ton panel :

Dim uc As New cUserControl
AddHandler uc.ClickMiddle, AdressOf  UCsClickMiddle
colUC.Add(uc)
colUC(colUC.Count - 1).Top = e.Y
colUC(colUC.Count - 1).Left = e.X
Panel.Controls.Add(colUC(colUC.Count - 1))

Dans ton form :

Private Sub UCsClickMiddle (sender As Object, e As System.EventArgs)
    Dim UC As cUserControl = Sender'Récupère l'objet
    Dim Index As Integer = Panel.Controls.IndexOf (UC) 'Récupère l'index dans la collection de ton panel si besoin est
End Sub

Voila, je ne peux pas t'expliquer mieux que ca ^^

@+
                                                                                                                                        
Si le déboguage est l'art d'enlever les bogue
3
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
2 juin 2009 à 19:10
Bonjour,

2 solutions :
 
1\ Tu déclare les variables de contrôles WithEvents au sein du formulaire. Par la suite tu ajoute un sub avec le handle du contrôle :

Private WithEvents colUControl As New UControl

Private Sub UcontrolsclickMiddle () Handles colUControl.clickMiddle
     [Code...]
End Sub 

/!\ les tableaux de contrôles ne sont pas pris en charge ! /!\

2\ Tu déclare tes contrôles au sein de la procédure Load du formulaire:

Private Sub Dialog1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
   
    Dim MyControl As New colUControl
    AddHandler (MyControl.clickMiddle, AddressOf UcontrolsclickMiddle)
    Me.Controls.Add (MyControl)

End Sub

Avec un sub comme délégué :

Private Sub UcontrolsclickMiddle ()
     [Code...]
End Sub 
                                             
Par contre, si tu veux récupérer le contrôle qui produit l'événement il te faut alors passer "sender" en paramètre :

Dans ton contrôle :

Event clickMiddle (sender As Object, e As System.EventArg)

et appeler cette procédure comme ceci :

RaiseEvent clickMiddle (Me, New System.EventArg)

Dans ton form :

Private Sub UcontrolsclickMiddle (sender As Object, e As System.EventArg)
     [Code...]
End Sub 

@+ Mayzz

                                                                                                                                        
Si le déboguage est l'art d'enlever les bogue
0
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

3 juin 2009 à 10:22
Bonjour Mayzz,

Je suis d'accord sur tes principes mais je ne peux pas mettre en place ces solutions !

J'ai du mal m'exprimer :
Si tu préfères, mes controls sont en dynamique via un clique sur un panel de ma main form [code behind de ma form]
        Dim uc As New cUserControl
        colUC.Add(uc )
        colUC(colUC.Count - 1).Top = e.Y
        colUC(colUC.Count - 1).Left = e.X
        Panel.Controls.Add(colUC(colUC.Count - 1))

Tout simplement.

Ensuite j'ai mes event des déplacement et de redimension via :
    Private Sub UC_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Dim NewLoc As New Point

        Select Case e.Button
            '--déplacement
            Case Windows.Forms.MouseButtons.Left
                NewLoc.X = Me.Location.X + (e.X - InitLocation.X)
                NewLoc.Y = Me.Location.Y + (e.Y - InitLocation.Y)
                Me.Location = NewLoc
        ......
        End select

Et donc sur ma form principale, j'ai Private colEntite As New List(Of cEntite)
Qui est la collection de mes contrôles.

Et somme, je ne vois pas du tout comment réaliser le code que tu m'a fournit soit le problème est bien là !

Merci
0
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

3 juin 2009 à 10:24
Je me sui trompé :
colEntite = colUC
cEntite = uc

;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

3 juin 2009 à 14:31
Merci beaucoup cela fonctionne du tonnerre

Juste une chose pour ceux qui ont le même soucis :
C'est AddressOf et non AdressOf (détail :D)

En fait le principe est très simple

A oui, juste une dernière question : pourquoi passer le e en paramètre de UCsClickMiddle ?
Pour agir les les erreurs ?

++
0
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
3 juin 2009 à 14:35
Désolé, je ne saisis pas le code dans l'IDE de vb, du coup l'intellisense n'est pas la pour me corriger ;o)

                                                                                                                                        
Si le déboguage est l'art d'enlever les bogue
0
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

3 juin 2009 à 14:39
pas de soucis pour l'autocomplétion par conter tu n'as pas répondu à ma question ;) héhé
0
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
3 juin 2009 à 14:42
Ah oui, heu... pour répondre à ta question c'est pour le Fun...

Non je plaisante, en fait c'est pour avoir un 'Standard' de procédure ainsi tu peu faire par exemple :

Dim uc As New cUserControl
AddHandler uc.ClickMiddle, AddressOf  UCsClickMiddle

Dim btn As New Button
AddHandler btn.Click, AddressOf  UCsClickMiddle

Les événements de deux types de contrôles différents déclanchement la même procédure, cela n'est possible que si le schema de paramètre est identique pour les deux contrôles, si tu essaye par exemple :

Dim uc As New cUserControl
AddHandler uc.ClickMiddle, AddressOf  UCsClickMiddle

Dim btn As New Button
AddHandler btn.MouseMove, AddressOf  UCsClickMiddle

Tu verra le resultat :)

                                                                                                                                        
Si le déboguage est l'art d'enlever les bogue
0
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

3 juin 2009 à 14:50
Ha ok bien compris merci bien...

Trivial (lorsque l'on a un bout d'idée haha)

Merci
0
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
3 juin 2009 à 14:52
Arf !
Je me suis mal exprimer, ce que je voulais dire c'est si tu as un schéma de paramètre comme celui ci :

Public Event  ClickMiddle (sender As Object)

Private Sub ControlDelegate (Sender As Object)

End Sub

et que tu essaye :

Dim btn As New Button
AddHandler btn.MouseMove, AddressOf  UCsClickMiddle

Tu ne pourras pas car la procédure MouseMove requière un paramètre e de type MouseEventArgs héritant de EventArgs.

[ Mince ! Je viens juste de m'appercevoir qu'il manque un bout de ma citation :( ]

                                                                                                                                        
Si le déboguage est l'art d'enlever les bogue, la programmation doit être l'art de les céer.
0
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
3 juin 2009 à 14:53
Oulala, pardon, je recommence :

Public Event  ClickMiddle (sender As Object)

Private Sub ControlDelegate (Sender As Object)

End Sub

et que tu essaye :

Dim btn As New Button
AddHandler btn.MouseMove, AddressOf  ControlDelegate

Désolé 3 post pour une explication

                                                                                                                                        
Si le déboguage est l'art d'enlever les bogue, la programmation doit être l'art de les créer.
0
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
3 juin 2009 à 14:57
Avec un 'S' à bogues ça fait mieux nan ??? XD

                                                                                                                                        
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
cs_ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

3 juin 2009 à 14:58
Haaa le mec il pourris le site de com pour gagner du points Haha

Merci pour ces infos, la migration m'est difficile mais agréable sur le fait que grâce au framework, on gagne un temps de développement fou et que le code est plus performant étant donné que les APIs win sont appelées par les méthodes de framework.

++
0