IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

AddHandler avec Handler qui prend ses arguments lors d'une boucle [Débutant]


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut AddHandler avec Handler qui prend ses arguments lors d'une boucle
    Bonjour à tous,

    Je suis débutant en VB.NET et je rencontre actuellement un problème lors de l'attribution d'EventHandlers à des contrôles crées dynamiquement.
    En résumé à chaque création d'une nouvelle DropDownItem dans le menu de mon application, je veux lui attribuer l'exécution d'une Sub qui prend des arguments dépendant de la DropDownItem cliquée.
    Par exemple si je clique sur "Calculateur n°1", une fenêtre aux caractéristiques du calculateur n°1 doit être crée pas la Sub. Ainsi de suite avec "Calculateur n°2" etc...

    Voici le bout code en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    For i As Integer = 0 To NumberOfECU - 1
    	Dim j As Integer
        	j = i
     
        	TCFMonitoringTool.CalculateursToolStripMenuItem.DropDownItems.Add(menuArray(i, 2)) 'Création dynamique du menu des Calculateurs
        	AddHandler TCFMonitoringTool.CalculateursToolStripMenuItem.DropDownItems.Item(i).Click, Sub(senderObj, args) _
                    beforeCreateECU(TCFMonitoringTool.CalculateursToolStripMenuItem.DropDownItems.Item(j), j)
     
    Next
     
     
    Sub beforeCreateECU(ByVal menuItem As ToolStripItem, ByVal ECUline As Integer)
     
         	Dim i As Integer = 0
         	Dim ECUCreated As Boolean = False
     
         	While ECUCreated = False
     
             	If IsNothing(ECU(ECUline, i)) = False AndAlso ECU(ECUline, i).Text = "" Then
     
                 		createECU(ECUline, i, menuItem)
                 		ECUCreated = True
     
             	ElseIf IsNothing(ECU(ECUline, i)) = True Then
     
                 		createECU(ECUline, i, menuItem)
                 		ECUCreated = True
             	Else
                 		i = i + 1
             	End If
         	End While
     
     End Sub


    Suite à ceci, j'ai bien les DropDownItems qui apparaissent dans le menu de l'application, avec les nom corrects, mais lorsque je clique par exemple sur celle qui s'appelle "Calculateur n°1", c'est une fenêtre à l'image de "Calculateur n°6" qui apparaît. C'est à dire le dernier calculateur de ma liste, donc la dernière itération de la boucle For.
    Pourquoi les arguments envoyés à ma Sub sont systématiquement les mêmes, quel que soit la DropDownItem cliquée? Pourtant dans AddHandler je précise bien que chaque Item(i) doit avoir sa propre Sub(argument1(i), argument2(i)) associée?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    la première chose à vérifier c'est de mettre un point d'arret dans la méthode pour voir si les arguments sont les bons
    si c'est le cas c'est le code d'après qui ne fait pas ce qu'il faut

    avec par exemple un espion express sur (menuitem is TCFMonitoringTool.CalculateursToolStripMenuItem.DropDownItems.Item(0)) pour un clic sur le 1er item
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre aide Pol63,

    J'ai crée un espion express comme vous l'avez préconisé mais ça ne fonctionne pas. Mon grand problème sur cette ligne AddHandler c'est que je ne peux rien visualiser durant le débogage.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    il faut mettre un point d'arret (F9) sur
    Sub beforeCreateECU(ByVal menuItem As ToolStripItem, ByVal ECUline As Integer)

    et là faire un espion express (shift+F9) pour vérifier le contenu de menuItem et ECUline
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    D'accord j'avais mal compris, donc ca me donne à chaque fois:
    menuItem = {Calculateur 6}
    ECUline = 6
    autrement dit les dernières infos de la boucle For qui s'est produite dans la fonction précédente.
    On dirait donc que la Sub fonctionne bien (elle m'affiche effectivement une fenêtre) mais pas avec les bons arguments (la fenêtre n'est pas celle décrivant le Calculateur demandé)

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    tu peux tenter de mettre un point d'arret sur le AddHandler mais avec la méthode anonyme ca ne simplifie pas le débuggage

    sinon tu peux faire la méthode standard, à savoir faire addhander , addressof laméthode

    et dans la méthode tu as sender qui est l'élement déclencheur, ce qui revient quasiment au même que ce que tu fais sans créer x méthodes anonymes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci effectivement il y a du mieux!
    Maintenant le senderObj est bien reconnu et la fenêtre qui s'affiche possède le même nom que la dropDownItem sur laquelle j'ai cliqué. Cependant la mise en forme ne suit pas puisque je n'ai pas trouvé de moyen d'utiliser le sender pour affecter ECULine (qui du coup reste à 0 et dessine une fenêtre correspondant uniquement à Calculateur 0)

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub beforeCreateECU2(ByVal senderObj As Object, ByVal e As System.EventArgs)
     
            Dim i As Integer = 0
            Dim ECUCreated As Boolean = False
            Dim ECULine As Integer = 0
     
            While ECUCreated = False
                If IsNothing(ECU(ECULine, i)) = False AndAlso ECU(ECULine, i).Text = "" Then
                    'If ECU(2, i).Text = "" Then
                    'ECU(2, i).Visible = True
                    createECU(ECULine, i, senderObj)
                    ECUCreated = True
                    'End If
                ElseIf IsNothing(ECU(ECULine, i)) = True Then
                    createECU(ECULine, i, senderObj)
                    ECUCreated = True
                Else
                    i = i + 1
                End If
            End While
     
        End Sub
    Comment puis-je faire pour modifier ECULine en fonction du senderObj? Puis-je détecter si le senderObj est l'Item 0 du ToolStripMenu par exemple?

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    Citation Envoyé par Pulcrix Voir le message
    Comment puis-je faire pour modifier ECULine en fonction du senderObj? Puis-je détecter si le senderObj est l'Item 0 du ToolStripMenu par exemple?
    ca doit être faisable mais pas de manière très propre
    une des méthodes propres pour une lier une variable à une autre est d'utiliser un dictionary

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private _dicoMenuItems as new collections.Generic.Dictionary(Of tollstripitem, integer)
    et dans la boucle après le addhandler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _dicoMenuItems.add( ... .items(j),j)
    ensuite dans la sub liée à l'event :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim ECUline as integer = _dicoMenuItems(directcast(sender, tollstripitem))
    une autre méthode est de faire une classe qui inherits de toolstrip item, ce qui permet de l'ajouter dans le menustrip comme une instance normale, et de lui ajouter la ou les propriétés qu'on voudrait qu'elle ait
    ensuite avec un cast on peut accéder à toutes les propriétés
    après on pourrait alors même lui mettre une méthode d'ouverture du form, et appeler cette méthode sur l'event, et avec un peu de chance, on peut faire overrides OnClick dessus pour lui faire ouvrir le form, et donc ce passer du addhandler dans la boucle ^^ (cette possibilité dépend de la classe de base que je ne connais pas, elle ne gère peut etre pas son event click toute seule)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour votre aide ça marche parfaitement!

    J'ai utilisé votre première proposition et les fenêtres s'affichent désormais avec le nom correct et la mise en forme souhaitée.

    Merci encore, et bonne fin de journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Fonction dans un module qui prend en argument un formulaire
    Par kawaya dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/07/2013, 13h22
  2. fonction qui modifie ses arguments d'entrée
    Par Amergin dans le forum Caml
    Réponses: 9
    Dernier message: 05/01/2009, 17h32
  3. Nommer ses états lors d'une exportation
    Par pierre24 dans le forum IHM
    Réponses: 4
    Dernier message: 06/08/2008, 11h30
  4. Création d'une fonction qui prend en argument une liste de cellule
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2007, 20h49
  5. Qu'est ce qui prend de la place dans une db access
    Par lepirlouit dans le forum Access
    Réponses: 8
    Dernier message: 25/07/2006, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo