[VB.NET] Comment gérer des évenements sur des objets créés dynamiquement ? [Résolu]

Messages postés
7
Date d'inscription
mardi 16 novembre 2004
Statut
Membre
Dernière intervention
28 février 2006
- - Dernière réponse : Dalida
Messages postés
6764
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
- 27 févr. 2006 à 18:23
Bonjour,

Je travaille sur un programme où je charge dynamiquement un menu avec des enregistrements provenant d'un fichier Access
(par menu j'entends bien "MenuItem" et non pas menu déroulant)

Je voudrai créer des évenements sur ces objets mais vu qu'ils ont été créés dynamiquement
je ne sais pas comment les déclarer.

Je vous mets le code qui me sert à charger dynamiquement mon menu (c'est du bricolage )

        Dim MyConnexion As New OleDb.OleDbConnection
        MyConnexion.ConnectionString = "provider=microsoft.jet.oledb.4.0;" & _
"data source= " & Application.StartupPath & "" & "bd.mdb;"
        Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()

        Mycommand.CommandText = "SELECT distinct ( niveau ) from documents"
        MyConnexion.Open()
        Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
        Dim str As String
        Dim i As Integer
        Do While myReader.Read()
            str = myReader.GetString(0)
            MenuItem7.MenuItems.Add(str)

            MenuItem7.MenuItems.Item(i).MenuItems.Add("Documents d'application")
            'Debut du chargement des docs d'app
            Dim MyConnexion1 As New OleDb.OleDbConnection
            MyConnexion1.ConnectionString = "provider=microsoft.jet.oledb.4.0;" & _
    "data source= " & Application.StartupPath & "" & "bd.mdb;"
            Dim Mycommand1 As OleDbCommand = MyConnexion1.CreateCommand()

            Mycommand1.CommandText = "SELECT nom_doc from documents where niveau='" & str & "' and type=1"
            MyConnexion1.Open()
            Dim myReader1 As OleDbDataReader = Mycommand1.ExecuteReader()
            Dim str1 As String
            Dim j As Integer = 0
            Do While myReader1.Read()
                str1 = myReader1.GetString(0)
                MenuItem7.MenuItems.Item(i).MenuItems.Item(0).MenuItems.Add(str1.Substring(0, str1.Length - 4))
                j = j + 1
            Loop
            If j = 0 Then
                MenuItem7.MenuItems.Item(i).MenuItems.Item(0).Enabled = False
            End If

            myReader1.Close()
            MyConnexion1.Close()
        myReader.Close()
        MyConnexion.Close()


Merci d'avance pour votre aide
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
6764
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
3
Merci
salut,



il faut lier l'évènement Click de ton MenuItem à un EventHandler.



soit en utilisant une surcharge du constructeur de MenuItem :

Dim itm As New MenuItem("Text", AddressOf MenuItems_OnClick)



soit en ajoutant explicitement le Handler au MenuItem déjà créé :

AddHandler itm.Click, AddressOf MenuItems_OnClick



sachant que tu auras créé une méthode prenant les mêmes paramètres que l'évènement OnClick du MenuItem :

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

' traitement...

End Sub




[ Dalida ]<hr>
pensez à indiquer la version du language

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
7
Date d'inscription
mardi 16 novembre 2004
Statut
Membre
Dernière intervention
28 février 2006
0
Merci
Merci beaucoup pour l'aide
mais...
Il faudrait remplacer le AdressOf par quelque chose ?
mais je sais pas quoi

parce que la j'ai la double erreur suivante :
- Le nom 'AdressOf' n'est pas déclaré.
- Virgule, ')' ou continuation d'expression valide attendue.
Messages postés
7
Date d'inscription
mardi 16 novembre 2004
Statut
Membre
Dernière intervention
28 février 2006
0
Merci
Bon, alors, j'avoue, je suis pas malin... :)
Il m'a fallu du temps pour voir qu'il fallait mettre 2 "d" à AddressOf

Donc, merci c'est bon, ça fonctionne :)

je remets la partie de code que j'ai modifée pour que ca marche :

 Dim str1 As String
            Dim j As Integer = 0
            Dim itm As MenuItem
            Do While myReader1.Read()
                str1 = myReader1.GetString(0)
                str1 = str1.Substring(0, str1.Length - 4)
                itm = New MenuItem(str1, New EventHandler(AddressOf MenuItems_OnClick))
                MenuItem7.MenuItems.Item(i).MenuItems.Item(0).MenuItems.Add(itm)
                j = j + 1
            Loop
Messages postés
6764
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
0
Merci
re,



pourquoi créer explicitement une nouvelle instance d'EventHandler avec New ?

ça ne fonctionne pas sans ?



itm = New MenuItem(str1, AddressOf MenuItems_OnClick)


[ Dalida ]<hr>
pensez à indiquer la version du language
Messages postés
7
Date d'inscription
mardi 16 novembre 2004
Statut
Membre
Dernière intervention
28 février 2006
0
Merci
En fait au départ lorsque je voyais que ça ne fonctionnait pas,
j'ai essayé d'approfondir le problème sur internet à partir des informations
que tu m'avais données...pour me rendre compte que l'erreur venait de moi.

Je ne connaissais pas l'opérateur "AddressOf".
J'ai donc fait des recherches sur son utilisation.

Je voulais préciser explicitement "New EventHandler()" d'après les exemples que j'avais vu sur le net.

Mais effectivement ce n'est pas nécessaire de le préciser.
Messages postés
6764
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
0
Merci
ok !






[ Dalida ]<hr>
pensez à indiquer la version du language