IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

UserControl - Menu contextuel dynamique checkable ?


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut UserControl - Menu contextuel dynamique checkable ?
    Bonjour à tous,

    Ce que je souhaite faire :

    Actuellement je créé plusieurs usercontrol en vb.net. Dans l'un d'eux j'ai des labels qui doivent être créer dynamiquement avec les un au dessus des autres, cela va servir à afficher des mesures. (tension, courant, température etc.)

    Actuellement cela fonctionne en VB6, on migre enfin officiellement en .net

    Le soft va créer donc dynamiquement ces labels, mais l'utilisateur peux masquer ou afficher ceux qu'il désire. Pour ce faire il ouvre un menu contextuel en cliquant sur l'un des labels. Ce menu affiche donc la liste des labels(les mesures) disponible avec des cases à cocher. Charge à l'utilisateur de cocher ou non ceux qu'il veux.

    Ce que j'arrive à faire:

    Avec l'aide de ressource Microsoft, j'ai trouvé des exemples pour créer dynamiquement un menu contextuel et dans l'exemple un bouton créer dynamiquement lui aussi( https://msdn.microsoft.com/fr-fr/lib...(v=vs.71).aspx Et surtout (https://msdn.microsoft.com/fr-fr/lib...v=vs.100).aspx)). Pour moi c'est pas un bouton mais cela ne changera pas grand chose au final et c'est dans un usercontrol au lieu d'un Windows form mais j'ai réussi à l'adapter et a l'appliquer uniquement sur le bouton, mais je n'arrive pas a avoir la possibilité de checker ou pas, malgré d'autre tuto trouvé.


    Voici le code de mon usercontrol:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    Imports System
    Imports System.Collections.Generic
    Imports System.Windows.Forms
    Imports System.Drawing
     
    Public Class essaie
     
     
        ' Declare the ContextMenuStrip control.
        Private fruitContextMenuStrip As ContextMenuStrip
     
     
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            ' Create a new ContextMenuStrip control.
            fruitContextMenuStrip = New ContextMenuStrip()
     
            ' Attach an event handler for the 
            ' ContextMenuStrip control's Opening event.
            AddHandler fruitContextMenuStrip.Opening, AddressOf cms_Opening
     
            ' Assign the ContextMenuStrip to the form's 
            ' ContextMenuStrip property.
            Me.ContextMenuStrip = fruitContextMenuStrip
     
     
            'Add a button to the form and assign its ContextMenuStrip.
            Dim b As New Button()
            b.Location = New System.Drawing.Point(60, 60)
            Me.Controls.Add(b)
            b.ContextMenuStrip = fruitContextMenuStrip
     
        End Sub
     
        ' This event handler is invoked when the ContextMenuStrip
        ' control's Opening event is raised. It demonstrates
        ' dynamic item addition and dynamic SourceControl 
        ' determination with reuse.
        Sub cms_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
     
            ' Clear the ContextMenuStrip control's 
            ' Items collection.
            fruitContextMenuStrip.Items.Clear()
     
     
            fruitContextMenuStrip.Items.Add("Apples")
            fruitContextMenuStrip.Items.Add("Oranges")
            fruitContextMenuStrip.Items.Add("Pears")
     
            ' Set Cancel to false. 
            ' It is optimized to true based on empty entry.
            e.Cancel = False
        End Sub

    Merci de votre aide.

    Je précise que ce menu contextuel doit aussi s'afficher dans tous le usercontrol en plus des labels, si l'utilisateur enlève tous les labels il faut qu'il puisse les réactiver. Mais sa j'ai réussi à garder ce menu suivant le tuto Microsoft.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Bah ,il faut les mémoriser dans un List(Of ToolStripMenuItem) et les initialiser correctement :
    code exemple .vb:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Public Class Form2
        ' Declare the ContextMenuStrip control.
        Private fruitContextMenuStrip As ContextMenuStrip
        Private menuList As New List(Of ToolStripMenuItem)
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            fruitContextMenuStrip = New ContextMenuStrip()
     
            AddHandler fruitContextMenuStrip.Opening, AddressOf cms_Opening
     
            ' Assign the ContextMenuStrip to the form's 
            ' ContextMenuStrip property.
            Me.ContextMenuStrip = fruitContextMenuStrip
     
            menuList.Add(New ToolStripMenuItem("Apples"))
            menuList.Add(New ToolStripMenuItem("Oranges"))
            menuList.Add(New ToolStripMenuItem("Pears"))
            For Each item As ToolStripMenuItem In menuList
                item.CheckOnClick = True
            Next
     
     
     
     
            'Add a button to the form and assign its ContextMenuStrip.
            Dim b As New Button()
            b.Location = New System.Drawing.Point(60, 60)
            Me.Controls.Add(b)
            b.ContextMenuStrip = fruitContextMenuStrip
        End Sub
     
        Private Sub cms_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
     
            ' Clear 
            fruitContextMenuStrip.Items.Clear()
            fruitContextMenuStrip.Items.AddRange(menuList.ToArray)
     
            ' Set Cancel to false. 
            ' It is optimized to true based on empty entry.
            e.Cancel = False
     
        End Sub
     
    End Class
    bon code.....

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re
    probleme de mauvaise connexion et remontée de page de reponse...
    Les balises code sont improvisées !!!
    repost donc du code .vb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    Public Class Form2
     ' Declare the ContextMenuStrip control.
     Private fruitContextMenuStrip As ContextMenuStrip
     Private menuList As New List(Of ToolStripMenuItem)
     Public Sub New()
     
     ' Cet appel est requis par le concepteur.
     InitializeComponent()
     
     ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     fruitContextMenuStrip = New ContextMenuStrip()
     
     AddHandler fruitContextMenuStrip.Opening, AddressOf cms_Opening
     
     ' Assign the ContextMenuStrip to the form's 
     ' ContextMenuStrip property.
     Me.ContextMenuStrip = fruitContextMenuStrip
     
     menuList.Add(New ToolStripMenuItem("Apples"))
     menuList.Add(New ToolStripMenuItem("Oranges"))
     menuList.Add(New ToolStripMenuItem("Pears"))
     For Each item As ToolStripMenuItem In menuList
     item.CheckOnClick = True
     Next
     
     
     
     
     'Add a button to the form and assign its ContextMenuStrip.
     Dim b As New Button()
     b.Location = New System.Drawing.Point(60, 60)
     Me.Controls.Add(b)
     b.ContextMenuStrip = fruitContextMenuStrip
     End Sub
     
     Private Sub cms_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
     
     ' Clear 
     fruitContextMenuStrip.Items.Clear()
     fruitContextMenuStrip.Items.AddRange(menuList.ToArray)
     
     ' Set Cancel to false. 
     ' It is optimized to true based on empty entry.
     e.Cancel = False
     
     End Sub
     
     End Class
    bon code....

  4. #4
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonsoir,

    Merci MABROUKI, je regarde sa demain au taf, j'étais sur autre chose aujourd'hui et je n'ai pas eue le temps de regarder mes mails.

    Bonne soirée.

  5. #5
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonjour,

    Je viens de faire l'essaie et c'est parfait merci. Il me reste à capter l’événement du clic et/ou à analyser la liste afin d'afficher ou non mes labels (des boutons dans l'exemple), mais je vais essayer de chercher.

    merci encore


    [EDIT]

    Pour récupérer l’événement d'un clic sur le menu. il suffit d'ajouter:

    AddHandler item.Click, AddressOf EssaieToolStripMenuItem_Click pendant la boucle de déclaration que le menu est checkable. EssaieToolStripMenuItem_Click étant la méthode ou l'événement se produit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            For Each item As ToolStripMenuItem In menuList
                item.CheckOnClick = True
                AddHandler item.Click, AddressOf EssaieToolStripMenuItem_Click 'déclaration de l'événement.
                item.CheckState = CheckState.Checked     'J'en ai profité pour déclarrer les menus déjà checké
            Next
    Voici la méthode de l'événement: il reste bien sur le traitement à faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Private Sub EssaieToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles EssaieToolStripMenuItem.Click
            Dim check As Boolean
            Dim name As String
            For Each item As ToolStripMenuItem In menuList
                check = item.CheckState
                name = item.Text
            Next
        End Sub
    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. menu contextuel dynamique
    Par maleo833 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/09/2008, 09h12
  2. Création d'un menu contextuel dynamique.
    Par femfem dans le forum WinDev
    Réponses: 1
    Dernier message: 19/11/2007, 15h43
  3. [VBA]Menu contextuel dynamique dans un état
    Par marcb03 dans le forum VBA Access
    Réponses: 32
    Dernier message: 13/04/2007, 14h06
  4. Réponses: 3
    Dernier message: 30/03/2007, 08h24
  5. [VB6] menu contextuel dynamique
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/07/2003, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo