Xml vers menu dynamique

Signaler
Messages postés
2
Date d'inscription
dimanche 4 juillet 2010
Statut
Membre
Dernière intervention
7 juillet 2010
-
Messages postés
2
Date d'inscription
dimanche 4 juillet 2010
Statut
Membre
Dernière intervention
7 juillet 2010
-
Bonjour à tous,

Je vous explique mon problème :

J'ai un xml sous la forme :
<?xml version="1.0"?>
<Configure>
  <Menu Value="Menu1">
    <SousMenu Value="Sous menu 1" />
    <SousMenu Value="Sous menu 2" />
    <SousMenu Value="Sous menu 3" />
  </Menu>
  <Menu Value="Menu2">
    <SousMenu Value="Sous menu 1">
      <SousMenu Value="Sous menu 1" />
    </SousMenu>
  </Menu>
  <Menu Value="Menu3">
    <SousMenu Value="Sous menu 1" />
  </Menu>
</Configure>


A partir de ça, je voudrais créer une arborescence de toolStripMenu.
J'arrive bien à créer les éléments <Menu> mais je n'arrive pas à ajouter les <sousMenu> dans mes menus.

Auriez-vous une idée?

Voici le code que j'utilise :
    Public Sub loadXMLMenu(ByVal menu As MenuStrip)
        Dim xmlDoc As New Xml.XmlDocument
        Dim xmlNode As Xml.XmlNode
        Dim parentItem As ToolStripMenuItem

        If menu Is Nothing Then
            Throw New ArgumentNullException("MENU")
        End If

        Try
            xmlDoc.Load("c:\test.xml")

        Catch ex As Exception

        End Try

        For Each xmlNode In xmlDoc.DocumentElement.ChildNodes

            Try
                parentItem = New ToolStripMenuItem
                parentItem.Text = xmlNode.Attributes(0).Value
                menu.Items.Add(parentItem.Text, Nothing, New System.EventHandler(AddressOf menu_click))
                Try
                    colPath.Add(xmlNode.Attributes(1).Value, xmlNode.Attributes(0).Value) 'Ajout dans une collection
                   
                Catch ex As Exception

                End Try

                If xmlNode.ChildNodes.Count > 0 Then
                    addChildNodeMenu(menu, xmlNode, parentItem)
                End If

            Catch ex As Exception


            End Try

        Next
        menu.Refresh()
    End Sub

    Public Sub addChildNodeMenu(ByVal menu As MenuStrip, ByVal xmlNode As Xml.XmlNode, ByVal parentItem As ToolStripMenuItem)
        Dim childXMLNode As Xml.XmlNode
        Dim childItem As ToolStripMenuItem

        For Each childXMLNode In xmlNode.ChildNodes
            Try
                childItem = New ToolStripMenuItem
                childItem.Text = childXMLNode.Attributes(0).Value
                parentItem.DropDownItems.Add(childItem.Text, Nothing, New System.EventHandler(AddressOf menu_click))

                Try
                    colPath.Add(childXMLNode.Attributes(1).Value, childXMLNode.Attributes(0).Value)
                  
                Catch ex As Exception

                End Try
                If childXMLNode.ChildNodes.Count > 0 Then
                    addChildNodeMenu(menu, childXMLNode, childItem)
                End If
            Catch ex As Exception

            End Try


        Next
    End Sub


Merci de vos réponses :).
------------------------------------------------------------------------
Je parle moins maintenant. Je terrasse plus mes ennemis par l'éloquence. Plus je vieillis, plus je ferme ma gueule. Aujourd'hui ce qu'il me faudrait, c'est le médaillon d'Harpocrate, avec le doigt sur la bouche...

3 réponses

Messages postés
140
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
1 novembre 2010
5
Bonjour,
menu.Items.Add(parentItem.Text, Nothing, New System.EventHandler(AddressOf menu_click))

Il semble qu'avec ce code, VB prenne le parentItem comme item final.

Avec le code suivant ça marche :
menu.Items.Add(parentItem)

Quant aux sous sous menus, je n'ai pas tester.
Messages postés
140
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
1 novembre 2010
5
Oui, c'est bien cela, il faut utiliser
ToolStripItemCollection.Add, méthode (ToolStripItem)

et c'est lors de la création d'une nouvelle instance d'objet ToolStripMenuItem, qu'on lui donne son nom, lui attribut une image éventuellement et qu'on l'abonne à un événement comme suit :

    Public Sub loadXMLMenu(ByVal menu As MenuStrip)
        Dim xmlDoc As New Xml.XmlDocument
        Dim xmlNode As Xml.XmlNode
        Dim parentItem As ToolStripMenuItem

        If menu Is Nothing Then
            Throw New ArgumentNullException("MENU")
        End If

        Try
            xmlDoc.Load("c:\test.xml")

        Catch ex As Exception

        End Try

        For Each xmlNode In xmlDoc.DocumentElement.ChildNodes

            Try
                parentItem = New ToolStripMenuItem(xmlNode.Attributes(0).Value, Nothing, New EventHandler(AddressOf menu_Click))
                menu.Items.Add(parentItem)
                Try
                    colPath.Add(xmlNode.Attributes(1).Value, xmlNode.Attributes(0).Value) 'Ajout dans une collection

                Catch ex As Exception

                End Try

                If xmlNode.ChildNodes.Count > 0 Then
                    addChildNodeMenu(menu, xmlNode, parentItem)
                End If

            Catch ex As Exception


            End Try
        Next
        'menu.Refresh()
    End Sub

    Public Sub addChildNodeMenu(ByVal menu As MenuStrip, ByVal xmlNode As Xml.XmlNode, ByVal parentItem As ToolStripMenuItem)

        Dim childXMLNode As Xml.XmlNode
        Dim childItem As ToolStripMenuItem

        For Each childXMLNode In xmlNode.ChildNodes
            Try
                childItem = New ToolStripMenuItem(xmlNode.Attributes(0).Value, Nothing, New EventHandler(AddressOf menu_Click))
                parentItem.DropDownItems.Add(childItem)
                Try
                    colPath.Add(childXMLNode.Attributes(1).Value, childXMLNode.Attributes(0).Value)

                Catch ex As Exception

                End Try
                If childXMLNode.ChildNodes.Count > 0 Then
                    addChildNodeMenu(menu, childXMLNode, childItem)
                End If
            Catch ex As Exception

            End Try
        Next
    End Sub
Messages postés
2
Date d'inscription
dimanche 4 juillet 2010
Statut
Membre
Dernière intervention
7 juillet 2010

Je vous remercie beaucoup, la deuxième solution fonctionne parfaitement .

Voici le code qui fonctionne :
Public Sub loadXMLMenu(ByVal menu As MenuStrip)
        Dim xmlDoc As New Xml.XmlDocument
        Dim xmlNode As Xml.XmlNode
        Dim parentItem As ToolStripMenuItem

        If menu Is Nothing Then
            Throw New ArgumentNullException("MENU")
        End If

        Try
            xmlDoc.Load("c:\test.xml")

        Catch ex As Exception

        End Try

        For Each xmlNode In xmlDoc.DocumentElement.ChildNodes

            Try
                parentItem = New ToolStripMenuItem(xmlNode.Attributes(0).Value, Nothing, New EventHandler(AddressOf menu_Click))
                menu.Items.Add(parentItem)
                Try
                    colPath.Add(xmlNode.Attributes(1).Value, xmlNode.Attributes(0).Value) 'Ajout dans une collection

                Catch ex As Exception

                End Try

                If xmlNode.ChildNodes.Count > 0 Then
                    addChildNodeMenu(menu, xmlNode, parentItem)
                End If

            Catch ex As Exception


            End Try
        Next
        'menu.Refresh()
    End Sub

    Public Sub addChildNodeMenu(ByVal menu As MenuStrip, ByVal xmlNode As Xml.XmlNode, ByVal parentItem As ToolStripMenuItem)

        Dim childXMLNode As Xml.XmlNode
        Dim childItem As ToolStripMenuItem

        For Each childXMLNode In xmlNode.ChildNodes
            Try
                childItem = New ToolStripMenuItem(childXMLNode.Attributes(0).Value, Nothing, New EventHandler(AddressOf menu_click))
                parentItem.DropDownItems.Add(childItem)
                Try
                    colPath.Add(childXMLNode.Attributes(1).Value, childXMLNode.Attributes(0).Value)

                Catch ex As Exception

                End Try
                If childXMLNode.ChildNodes.Count > 0 Then
                    addChildNodeMenu(menu, childXMLNode, childItem)
                End If
            Catch ex As Exception

            End Try
        Next
    End Sub




Je parle moins maintenant. Je terrasse plus mes ennemis par l'éloquence. Plus je vieillis, plus je ferme ma gueule. Aujourd'hui ce qu'il me faudrait, c'est le médaillon d'Harpocrate, avec le doigt sur la bouche...