MenuStrip et ToolStrip

Résolu
domingoninja Messages postés 7 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 février 2009 - 12 déc. 2008 à 13:11
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 - 12 déc. 2008 à 20:14
Bonjour,
Un truc que je savais bien faire en vb6, quand ce n'était pas encore MenuStrip, mais avec lequel j'ai du mal avec vb.net :
J'ai une form avec un MenuStrip et un ToolStrip en dessous.
Dans le MenuStrip, j'ai (par exemple) :
- Fiche
      -- Suivante -- Tag = "SUIV"
      -- Précédente -- Tag = "PREC"
      -- Enregistrer -- Tag = "ENREG"
      -- Quitter -- Tag = "QUIT"
Dans le ToolStrip positionnée sous le MenuStrip j'ai des icônes (de raccourci) qui reprennent certaines fonctions de mon MenuStrip :
- Image 'Flèche droite' (Suivante) -- Tag = "SUIV"
- Image 'Flèche gauche' (Précédente) -- Tag = "PREC"
- Image 'Disquette' (Enregistrer) -- Tag = "ENREG"

J'aimerais intercepter, via un évènement du genre 'OnItemClick', la valeur du Tag du choix effectué par l'utilisateur DANS LA MEME PROCEDURE EVENEMENTIELLE.
Celà est-il possible ?
Comment ? (c'est mieux)

En attendant vos milliards d'idées ...
(Et de solutions ...)

Dom.
A voir également:

5 réponses

domingoninja Messages postés 7 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 février 2009
12 déc. 2008 à 19:19
Salut et encore merci à Fauve et Radcur pour leur aide ...

J'ai trouvé comment faire.

La solution de Radcur est bonne (ou presque) mais elle oblige d'énumérer tous les ToolStrip et MenuStrip existants.

En fait, il suffit de créer (ex: ToolStrip_et_MenuStrip_ItemClicked) et d'affecter soi-même la procédure d'évènement (AddHandler pour la ToolStripItemCollection complète du MenuStrip par boucle s'appelant elle-même (déjà traité sur le forum), et AddHandler pour tous les ToolStrip.Items).
Genre :
Private Sub ToolStrip_et_MenuStrip_ItemClicked(Byval sender as Object, Byval e as System.EventArgs)
   Select Case CType(sender, Object).Tag
      Case "SUIV"
         'Traitement
      Case "PREC"
         'Traitement
      Case ...
   End Select
End Sub

Merci à ceux qui se sont intéressé à mon problème...

Si vous avez des commentaires ou des corrections ou critiques à formuler, n'hésitez pas !

Dom.
3
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
12 déc. 2008 à 20:14
Salut,

La seule solution est que ton MenuStrip doit être dynamiquement, voici un code tout prêt pour toi :





Explication syntaxe fonction
creation_sous_menu :


creation_sous_menu(ByVal Menu As MenuStrip, ByVal IndexMenu As Integer, ByVal SubMenu As String(), ByVal TagText As String())




> Menu : Doit être un MenuStrip
> IndexMenu : Correspond à l'index du menu où ajouter les sous menus (Exemple : le menu Fiche a pour index 0 car c'est le premier)
Si tu crée un autre menu à coté, il aura pour index 1
> SubMenu : Contient le texte à afficher pour les sous menus
> TagText : Contient les tags associé au sous menus








Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Déclaration d'un MenuStrip
        Dim MainMenu As New MenuStrip

        ' Ajout de ce MenuStrip dans le Formulaire
        Me.Controls.Add(MainMenu)

        ' Ajout du menu Fiche
        MainMenu.Items.Add("Fiche")

        ' Défini les sous menus du menu Fiche
        Dim MenuSubItems() As String = {"Suivante", "Précédente", "Enregistrer", "Quitter"}

        ' Défini les Tags associés au sous menu
        Dim TagText() As String = {"SUIV", "PREC", "ENREG", "QUIT"}

        'Fonction créant les sous menus
        creation_sous_menu(MainMenu, 0, MenuSubItems, TagText)

    End Sub

    Sub creation_sous_menu(ByVal Menu As MenuStrip, ByVal IndexMenu As Integer, ByVal SubMenu As String(), ByVal TagText As String())
        'Déclaration d'un ContextMenuStrip
        Dim cms As New ContextMenuStrip

        ' Parcoure tous les sous menus souhaitant être crées
        For nb As Integer = 0 To SubMenu.Count - 1

            ' Ajout du sous menu en cours dans le ContextMenuStrip
            cms.Items.Add(SubMenu(nb))

            ' Défini le tag du sous menu en cours
            cms.Items(cms.Items.Count - 1).Tag = TagText(nb)

            ' Ajout d'un évènement clic pour le sous menu en cours
            ' La fonction exécuté lors du clic sera SubItemsMenu

            ' A cause de la boucle For, un clic sur n'importe quel sous menu
            ' sera exécuté par une seule et unique fonction qui est SubItemsMenu
            AddHandler cms.Items(cms.Items.Count - 1).Click, AddressOf SubItemsMenu
        Next

        ' Les deux dernières lignes de codes ajoutent les sous menus au menu Fiche
        Dim tsi As ToolStripMenuItem = CType(Menu.Items(IndexMenu), ToolStripMenuItem)

        tsi.DropDown = cms

    End Sub

    Sub SubItemsMenu(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' sender correspondra au sous menu cliqué
        MsgBox(sender.Tag)
    End Sub

End Class





Note : J'espère que c'est ce que tu cherchais. Si tu as des questions, n'hésites pas

++

Fauve


Pensez : Réponse Acceptée 
3
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
12 déc. 2008 à 14:02
Salut,


Si ton MenuStrip et ton ToolStrip sont crée à partir de la Boite
à Outils, en double cliquant
sur un item du ToolStrip, tu feras apparaitre une procédure évènementielle (celle associé au clic de l'item en question)

Il faut que tu utilises la variable sender qui correspond à l'item cliqué. Ainsi en faisant sender.Tag, tu obtiens le Tag de l'item cliqué.

J'espère que c'est cà que tu veux savoir car je n'ai pas vraiment bien compris ce que tu veux faire. Si c'est pas le cas, peux tu expliquer ton problème de manière plus claire Merci 

++

Fauve


Pensez : Réponse Acceptée 
0
domingoninja Messages postés 7 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 février 2009
12 déc. 2008 à 17:33
Merci à toi Fauve pour ta tentative d'aide ...
Mais :
 - Pour ToolStrip et MenuStrip :
   La procédure évènementielle générée par vb.net lorsqu'on double-clique sur un item est du type 'Item.click'. Dans ce cas, on connaît exactement l'élément qui a été choisi par l'utilisateur (puisque c'est cet item précis qui a déclenché l'évènement).

Exemple :
Private Sub ToolStrip_Item1_Click(Byval sender as System.Object, Byval e as System.EventArgs) Handles ToollStrip_Item1.Click
   'L'élément choisi est Item1
End Sub

- Pour ToolStrip :
   On peut utiliser la procédure évènementielle 'ToolStrip.ItemClicked' (évènement click sur le ToolStrip) et tester la valeur de e.ClickedItem.Tag pour savoir quel item a été choisi (cette solution est déjà meilleure ... je trouve ...).
Exemple :
Private Sub ToolStrip_ItemClicked(Byval sender as System.Object, Byval e as System.EventArgs) Handles ToolStrip.ItemClicked 
   Select Case e.ClickedItem.Tag
      Case "SUIV"
         'Traitement pour Tag="SUIV"
      Case "PREC"
         'Traitement pour Tag="PREC"
      Case ...
   End Select
End Sub

J'aurais souhaité utiliser la même procédure que ci-dessus pour gérer le click sur un item de mon MenuStrip. Malheureusement l'évènement 'ItemClicked' de MenuStrip ne se déclenche que lorsqu'on sélectionne un choix du premier menu (Fiche) et non les choix sous-jacents (Suivant, Précédent etc ...).
Le but est de ne pas avoir autant de procédures évènementielles qu'il y a de choix au menu, et de gérer dans la même procédure n'importe quel choix de l'utilisateur, qu'il soit fait par MenuStrip, ou par ToolStrip.

Est-ce plus clair depuis mes explications ? N'hésitez pas à m'en demander d'autres si je suis encore trop confus ... 

Merci pour vos réponses

Dom.
0

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

Posez votre question
radcur Messages postés 282 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 15 août 2012 2
12 déc. 2008 à 18:35
salut

je n'ai pas la possibilité de le tester en ce moment mais il est possible de regrouper plusieurs évènements sous une seul sub pour plusieurs objets du même type (exemple les ToolStripMenuItem)

private sub MenuItemClick(Byval sender as System.Object, Byval e as System.EventArgs) Handles ToolStripFiche.ItemClicked, ToolStripSuivant.itemclicked,  tous les ToolStripMenuItem de ton menu...
         'tu travailles ensuite avec les parametres pour récupérer  l'item du menu qui a cliqué
end sub
0
Rejoignez-nous