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

Résolu
bounty_hunter Messages postés 7 Date d'inscription mardi 16 novembre 2004 Statut Membre Dernière intervention 28 février 2006 - 27 févr. 2006 à 12:19
Dalida Messages postés 6728 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
A voir également:

6 réponses

Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016
27 févr. 2006 à 12:42
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
3
bounty_hunter Messages postés 7 Date d'inscription mardi 16 novembre 2004 Statut Membre Dernière intervention 28 février 2006
27 févr. 2006 à 13:05
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.
0
bounty_hunter Messages postés 7 Date d'inscription mardi 16 novembre 2004 Statut Membre Dernière intervention 28 février 2006
27 févr. 2006 à 13:46
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
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016
27 févr. 2006 à 17:13
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
0

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

Posez votre question
bounty_hunter Messages postés 7 Date d'inscription mardi 16 novembre 2004 Statut Membre Dernière intervention 28 février 2006
27 févr. 2006 à 18:21
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.
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016
27 févr. 2006 à 18:23
ok !






[ Dalida ]<hr>
pensez à indiquer la version du language
0
Rejoignez-nous