
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.