Evenements Usercontrol et collection d'objets [Résolu]

cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 2 juin 2009 à 16:45 - Dernière réponse : cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention
- 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
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 3 juin 2009 à 13:54
3
Merci
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

Merci Mayzz 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de Mayzz
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 2 juin 2009 à 19:10
0
Merci
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
Commenter la réponse de Mayzz
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 3 juin 2009 à 10:22
0
Merci
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
Commenter la réponse de cs_ABF
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 3 juin 2009 à 10:24
0
Merci
Je me sui trompé :
colEntite = colUC
cEntite = uc

;)
Commenter la réponse de cs_ABF
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 3 juin 2009 à 14:31
0
Merci
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 ?

++
Commenter la réponse de cs_ABF
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 3 juin 2009 à 14:35
0
Merci
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
Commenter la réponse de Mayzz
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 3 juin 2009 à 14:39
0
Merci
pas de soucis pour l'autocomplétion par conter tu n'as pas répondu à ma question ;) héhé
Commenter la réponse de cs_ABF
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 3 juin 2009 à 14:42
0
Merci
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
Commenter la réponse de Mayzz
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 3 juin 2009 à 14:50
0
Merci
Ha ok bien compris merci bien...

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

Merci
Commenter la réponse de cs_ABF
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 3 juin 2009 à 14:52
0
Merci
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.
Commenter la réponse de Mayzz
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 3 juin 2009 à 14:53
0
Merci
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.
Commenter la réponse de Mayzz
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 3 juin 2009 à 14:57
0
Merci
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.
Commenter la réponse de Mayzz
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 3 juin 2009 à 14:58
0
Merci
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.

++
Commenter la réponse de cs_ABF

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.