[Code Source] Ajouter un menu (sous menu) dynamiquement (ToolStripMenuItem) à partir d’une base de donnée MySQL

Si le menu d’un logiciel est amené à évoluer dans le temps il est préférable d’opter pour la création de menu dynamique. Alors qu’il est très facile de gérer un menu manuellement dans Visual Studio, la création automatique demande un peut plus de connaissance en programmation, car en plus de la création du menu il va falloir créer les actions à réaliser suite au click ou de passage de souris sur le menu !

Voici un exemple de menu créé dynamiquement. Le menu Favoris est créé à l’ouverture de la fenêtre de l’application. La liste des favoris est enregistré dans une base de données MySQL. Le sous menu peut donc évoluer dans le temps sans avoir besoin de toucher à une ligne de code de notre application.

1 – Création d’un menu (sans sous menu)

Le tableau « tab_favoris() », contient les favoris à rajouter au menu dont leur nombre est définit par la variable « nb_favoris ».

Structure Favoris
        Dim id As Integer
        Dim nom As String
        Dim http As String
    End Structure
 
    Public tab_favoris() As Favoris
    Public nb_favoris As Integer

Les favoris sont stockés dans une base de données de type MySQL. Pour lire la base de données et remplir le tableau voici le code.

Private Sub Lecture_Favoris()
        Try
            Dim table = "favoris"
            Dim requete As String = "SELECT * from " & table
            Dim cnx As New MySqlConnection() With {.ConnectionString = BDD_R1C_CONVERT}
            cnx.Open()
            Dim Commande As New MySqlCommand(requete, cnx)
            Dim MonReader As MySqlDataReader = Commande.ExecuteReader()
            nb_favoris = 0
            ReDim tab_favoris(nb_favoris)
            While MonReader.Read()
                nb_favoris += 1
                ReDim Preserve tab_favoris(nb_favoris)
                tab_favoris(nb_favoris).id = MonReader("id").ToString()
                tab_favoris(nb_favoris).nom = MonReader("r1c_nom").ToString()
                tab_favoris(nb_favoris).http = MonReader("r1c_http").ToString()
            End While
            cnx.Close()
            Trier_Favoris(tab_favoris, nb_favoris)
        Catch ex As Exception
 
        End Try
    End Sub

Pour la création du menu en fonction du nombre de favoris contenu dans la base de données voici le code.

'Mise à jour du menu des favoris
        Dim MS_item As New ToolStripMenuItem
        Dim MS_subitem As New ToolStripMenuItem
        MS_item = Ms_principal.Items(2)
        For i = 1 To nb_favoris
            MS_subitem = MS_item.DropDownItems.Add(tab_favoris(i).nom)
            AddHandler MS_subitem.Click, AddressOf Favoris_Click
        Next

Pour exécuter une action lorsque l’on click [MS_subitem.Click] sur l’un des choix du menu voici le code. Cette fonction est appelé grâce au code [AddressOf Favoris_Click] définit lors de la création du menu dynamique.

Private Sub Favoris_Click(ByVal sender As Object, ByVal e As EventArgs)
        Try
            Dim monitem As ToolStripItem = DirectCast(sender, ToolStripItem)
            For i = 1 To nb_favoris
                If monitem.Text = tab_favoris(i).nom Then
                    Process.Start(tab_favoris(i).http)
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message, vbCritical)
        End Try
    End Sub

2 – Création d’un menu avec sous menu

Pour la création d’un menu avec sous menu le principe est le même mis à par pour les actions sur le menu ou sur le sous menu. Dans l’exemple ci-dessous le menu concerne des documents.

Le menu contient la liste des documents et le sous menu de chaque document est composé de « Ouvrir » et « Mise à jour ». Dans ce cas il faut gérer le passage de la souris sur le menu et le click de la souris sur le sous menu.

Le tableau « tab_documents() », contient les favoris à rajouter au menu dont leur nombre est définit par la variable « nb_documents ».

Structure Documents
        Dim id As Integer
        Dim nom As String
        Dim fichier As String
    End Structure
 
    Public tab_documents() As Documents
    Public nb_documents As Integer

La liste des documents est stocké dans une base de données de type MySQL. Voici le code qui permet de lire la liste des documents qui vont constituer le menu.

Private Sub Lecture_Documents()
        Try
            Dim table = "document"
            Dim requete As String = "SELECT * from " & table
            Dim cnx As New MySqlConnection() With {.ConnectionString = BDD_R1C_CONVERT}
            cnx.Open()
            Dim Commande As New MySqlCommand(requete, cnx)
            Dim MonReader As MySqlDataReader = Commande.ExecuteReader()
            nb_documents = 0
            ReDim tab_documents(nb_documents)
            While MonReader.Read()
                nb_documents += 1
                ReDim Preserve tab_documents(nb_documents)
                tab_documents(nb_documents).id = MonReader("id").ToString()
                tab_documents(nb_documents).nom = MonReader("r1c_nom").ToString()
                tab_documents(nb_documents).fichier = MonReader("r1c_fichier").ToString()
            End While
            cnx.Close()
            Trier_Documents(tab_documents, nb_documents)
        Catch ex As Exception
 
        End Try
    End Sub

Voici le code pour la création dynamique du menu et des sous menu.

'Mise à jour du menu des documents
        MS_item = Ms_principal.Items(3)
        For i = 1 To nb_documents
            MS_subitem = MS_item.DropDownItems.Add(tab_documents(i).nom)
            AddHandler MS_subitem.MouseHover, AddressOf Documents_MouseHover
            Dim MS_subitem2 As New ToolStripMenuItem
            MS_subitem2 = MS_subitem.DropDownItems.Add("Ouvrir")
            AddHandler MS_subitem2.Click, AddressOf Documents_action_Click
            Dim MS_subitem3 As New ToolStripMenuItem
            MS_subitem3 = MS_subitem.DropDownItems.Add("Mise à jour")
            AddHandler MS_subitem3.Click, AddressOf Documents_action_Click
        Next

Voici le code pour les actions sur le menu et sous menu.

L’action sur le menu au passage de la souris [MS_subitem.MouseHover] est réalisée par la fonction [AddressOf Documents_MouseHover].

L’action sur le sous menu est réalisé au click [MS_subitem2.Click] et [MS_subitem3.Click] est réalisée par la fonction [AddressOf Documents_action_Click]

Private Sub Documents_MouseHover(ByVal sender As Object, ByVal e As EventArgs)
        Dim monitem As ToolStripItem = DirectCast(sender, ToolStripItem)
        nom_document = monitem.Text
    End Sub
 
    Private Sub Documents_action_Click(ByVal sender As Object, ByVal e As EventArgs)
        Try
            Dim monitem As ToolStripItem = DirectCast(sender, ToolStripItem)
            Select Case monitem.Text
                Case "Ouvrir"
                    For i = 1 To nb_documents
                        If nom_document = tab_documents(i).nom Then
                            Dim result As String = MsgBox("Voulez vous télécharger la dernière version du fichier " & nom_document & " ?", vbYesNoCancel)
                            Select Case result
                                Case vbYes
                                    Progression(50, 100)
                                    Afficher_message_status("Téléchargement du fichier " & nom_document & " en cours...")
                                    Telecharger_fichier(My.Settings.MySQL_serveur, tab_documents(i).fichier)
                                    Progression(80, 100)
                                    Afficher_message_status("Ouverture du fichier " & nom_document & " en cours...")
                                    Process.Start(appdocuments & tab_documents(i).fichier)
                                    Progression(100, 100)
                                Case vbNo
                                    Progression(80, 100)
                                    Afficher_message_status("Ouverture du fichier " & nom_document & " en cours...")
                                    Process.Start(appdocuments & tab_documents(i).fichier)
                                    Progression(100, 100)
                                Case vbCancel
                            End Select
 
                        End If
                    Next
                Case "Mise à jour"
                    For i = 1 To nb_documents
                        If nom_document = tab_documents(i).nom Then
                            Dim result As String = MsgBox("Attention : Confirmez vous la mise à jour du fichier " & nom_document & " ?", vbYesNoCancel)
                            Select Case result
                                Case vbYes
                                    Progression(50, 100)
                                    Afficher_message_status("Transfert du fichier " & nom_document & " en cours...")
                                    Transfert_fichier(My.Settings.MySQL_serveur, tab_documents(i).fichier)
                                    Progression(100, 100)
                                Case vbNo
                                    MsgBox("Le fichier " & nom_document & " n'a pas été mis à jour !")
                                Case vbCancel
                                    MsgBox("Vous avez annuler la mis à jour du fichier " & nom_document & " !")
                            End Select
                        End If
                    Next
                Case Else
                    MsgBox("Pas d'action possible !", vbInformation)
            End Select
            Progression(0, 0)
            Afficher_message_status("Prêt !")
        Catch ex As Exception
            Progression(0, 0)
            Afficher_message_status("Prêt !")
            MsgBox(ex.Message, vbCritical)
        End Try
    End Sub

En complément de cette partie, pour le menu des documents j’utilise un serveur FTP. L’ouverture d’un document peut être précédé d’un téléchargement du fichier. Et la mise à jour du document permet de transférer le document sur le serveur FTP. Le code pour la gestion FTP est disponible ici.

Soyez le premier à commenter

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*