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 :

DatagridView Menu uniquement sur une ligne selectionnée


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut DatagridView Menu uniquement sur une ligne selectionnée
    Bonjour,

    J'essaye de réaliser un événement qui me permet d'ouvrir un menu dans une datagridview, plus exactement, sur un ligne selectionné. J'ai réussi à faire le programme pour avoir un menu qui s'ouvre sur un clic droit mais il ne s'ouvre pas que sur la datagridview mais toute la form. Je voudrai le limité à une ligne selectionné.

    Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Procédure qui ouvre un menu dans datagridview sur un Click droit.
        Private Sub AffichierMenu_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
            If e.Button = MouseButtons.Right Then ' Lorsqu'on fait un click *droit*
                OuvrirMenu() 'Ouvre un menu
            End If
        End Sub
    voila au cas ou mes sous fonction qui me crée et ouvre un menu :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     Private ContextMenuStrip1 As ContextMenuStrip
        'Procedure qui permet d'ouvrir un menu
        Public Sub OuvrirMenu()
            ' Create a new ContextMenuStrip control.
            ContextMenuStrip1 = New ContextMenuStrip()
     
            ' Attach an event handler for the 
            ' ContextMenuStrip control's Opening event.
            AddHandler ContextMenuStrip1.Opening, AddressOf cms_Opening
     
            ' Create a new ToolStrip control.
            Dim ts As New ToolStrip()
     
            ' Create a ToolStripDropDownButton control and add it
            ' to the ToolStrip control's Items collections.
            Dim fruitToolStripDropDownButton As New ToolStripDropDownButton("Fruit", Nothing, Nothing, "Fruit")
            ts.Items.Add(fruitToolStripDropDownButton)
     
            ' Dock the ToolStrip control to the top of the form.
            ts.Dock = DockStyle.Top
     
            ' Assign the ContextMenuStrip control as the 
            ' ToolStripDropDownButton control's DropDown menu.
            fruitToolStripDropDownButton.DropDown = ContextMenuStrip1
     
            ' Create a new MenuStrip control and add a ToolStripMenuItem.
            Dim ms As New MenuStrip()
            Dim fruitToolStripMenuItem As New ToolStripMenuItem("Fruit", Nothing, Nothing, "Fruit")
            ms.Items.Add(fruitToolStripMenuItem)
     
            ' Dock the MenuStrip control to the top of the form.
            ms.Dock = DockStyle.Top
     
            ' Assign the MenuStrip control as the 
            ' ToolStripMenuItem's DropDown menu.
            fruitToolStripMenuItem.DropDown = ContextMenuStrip1
     
            ' Assign the ContextMenuStrip to the form's 
            ' ContextMenuStrip property.
            Me.ContextMenuStrip = ContextMenuStrip1
     
            ' Add the ToolStrip control to the Controls collection.
            Me.Controls.Add(ts)
     
            '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 = ContextMenuStrip1
     
            ' Add the MenuStrip control last.
            ' This is important for correct placement in the z-order.
            Me.Controls.Add(ms)
        End Sub
        'Procedure qui contient ce qui ce trouve dans le menu
        Sub cms_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
            ' Acquire references to the owning control and item.
            Dim c As Control = ContextMenuStrip1.SourceControl
            Dim tsi As ToolStripDropDownItem = ContextMenuStrip1.OwnerItem
     
            ' Clear the ContextMenuStrip control's 
            ' Items collection.
            ContextMenuStrip1.Items.Clear()
     
            ' Populate the ContextMenuStrip control with its default items.
     
            ContextMenuStrip1.Items.Add("Continue Updating")
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Acknowledge Single Alarm")
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Open Control Display")
            ContextMenuStrip1.Items.Add("Open Faceplate Display")
            ContextMenuStrip1.Items.Add("Open Detail Display")
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Suppress Alarm")
            ' Set Cancel to false. 
            ' It is optimized to true based on empty entry.
            e.Cancel = False
        End Sub
    Alors le programme marche tres bien mais je voudrai bien pouvoir contrôler le clic droit où je le désire et ensuite je voudrai bien aussi avoir des indication pour savoir comment faire si j'ai selectionner un onglé dans mon menu et les conséquence qu'il entraine !!

    Merci d'avance pour vos solutions !!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Citation Envoyé par dragondumond Voir le message
    J'ai réussi à faire le programme pour avoir un menu qui s'ouvre sur un clic droit mais il ne s'ouvre pas que sur la datagridview mais toute la form.
    A voir en supprimant cette instruction, car ici, sauf erreur, vous assignez le ContextMenu au formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            ' Assign the ContextMenuStrip to the form's 
            ' ContextMenuStrip property.
            Me.ContextMenuStrip = ContextMenuStrip1

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Il y donc 3 problèmes (1-clic uniquement sur datagridview; 2-déterminer la ligne; 3-réagir au choix d'un sous-menu)

    1) Déjà clic sur datagridview uniquement
    En plus de l'indication donnée par chrismonoye
    Remplacez
    Citation Envoyé par dragondumond Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            '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 = ContextMenuStrip1
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            DataGridView1.ContextMenuStrip = ContextMenuStrip1
    Cela provoquera l'afichage du menu contextuel seulement sur le clic dans le DataGridView.

    Point 2 - peut-etre avec DataGridView1.SelectedRows[0].Index pour connaître la ligne --- Edit ---

    Ensuite point 3
    Il faut attribuer un évènement au clic dans le menu contextuel
    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' Populate the ContextMenuStrip control with its default items.
             ContextMenuStrip1.Items.Add("Continue Updating")
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Acknowledge Single Alarm")
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Open Control Display")
            ContextMenuStrip1.Items.Add("Open Faceplate Display")
            ContextMenuStrip1.Items.Add("Open Detail Display")
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Suppress Alarm")
            ' Set Cancel to false. 
            ' It is optimized to true based on empty entry.
            e.Cancel = False
        End Sub
    par
    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
            ' Populate the ContextMenuStrip control with its default items.
            ContextMenuStrip1.Items.Add("Continue Updating")
            AddHandler ContextMenuStrip1.Items(0).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Acknowledge Single Alarm")
            AddHandler ContextMenuStrip1.Items(2).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Open Control Display")
            AddHandler ContextMenuStrip1.Items(4).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("Open Faceplate Display")
            AddHandler ContextMenuStrip1.Items(5).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("Open Detail Display")
            AddHandler ContextMenuStrip1.Items(6).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Suppress Alarm")
            AddHandler ContextMenuStrip1.Items(8).Click, AddressOf cms_Click
            ' Set Cancel to false.  ' It is optimized to true based on empty entry.
            e.Cancel = False
        End Sub
     
        Private Sub cms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            MsgBox("Click avec " & sender.text)
        End Sub
    On ne peut pas faire un For Each sur MenuItems parcequ'il y a des séparateurs.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Merci beaucoup, te trop un boss ^^

    Maintenant, le menu s'ouvre que dans la datagridview, j'ai complétement vidé ma procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub OuvrirMenu()
            ' Create a new ContextMenuStrip control.
            ContextMenuStrip1 = New ContextMenuStrip()
            AddHandler ContextMenuStrip1.Opening, AddressOf cms_Opening
            DataGridView1.ContextMenuStrip = ContextMenuStrip1
        End Sub
    Et sa marche super bien !!

    Par contre je gère tjs pas le fait de clicker sur une ligne seulement, j'ai pensé à un truc, un clic droit sur une ligne provoque sa sélection et ouvre le menu. Et évité d'ouvrir un meni lorsqu'on clic pas sur une ligne.

    Sinon merci beaucoup pour la dernière solution avec le teste, j'arrive aussi à géré ce qu'il arrive si je clic sur un ongle du menu et sa m'aide beaucoup !!

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Alors j'ai reussi à avancer un peu mon programme :

    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
    Public Sub OuvrirMenu()
            ' Create a new ContextMenuStrip control.
            Dim z, z1 As Integer
            ContextMenuStrip1 = New ContextMenuStrip()
            AddHandler ContextMenuStrip1.Opening, AddressOf cms_Opening
            For z = 0 To i - 1
                For z1 = 0 To i - 1
                    If DataGridView1.Rows(z1).Selected = True Then
                        DataGridView1.Rows(z1).Selected = False
                    End If
                Next
                DataGridView1.Rows(z).Selected = True
                DataGridView1.Rows(z).ContextMenuStrip = ContextMenuStrip1
            Next
        End Sub
    i = nombre de ligne dans mon datagridview
    La première boucle for permet de vérifier chaque ligne si on a clicker dessus ou pas.
    La seconde boucle for permet de vérifier si une ligne est sélectionné dans mon tableau, la déselectionner puis sélectionné la ligne sur la quelle je viens de clicker.
    J'ai juste remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView1.ContextMenuStrip = ContextMenuStrip1
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView1.Rows(z).ContextMenuStrip = ContextMenuStrip1
    Ce qui me permet uniquement d'ouvrir un menu sur une ligne.


    Par contre j'ai un souci avec mon programme, j'arrive pas a dé-sélectionner la ligne qui est actuellement sélectionner et en sélectionner une autre.

    J'ai aussi un autre souci, a chaque fois que j'ai une nouvelle ligne qui s'insert dans mon datagridview, la dernière ligne est automatiquement sélectionné ce que je souhaite pas !!

    Merci d'avance pour vos solutions !!

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    J'ai un peu compris mon erreur mais je vois pas comment la corriger.

    Enfaite, je désactive une seule fois la ligne sélectionné et ensuite j'active la sélection toutes les lignes et comme je suis sur MultiSelect= False donc automatiquement la dernière ligne est sélectionné.

    Je travail sur une boucle If qui me permet de vérifier si on a clicker sur une ligne pour validé sa selection et ouvrir un menu mais je sais pas comment ecrire la condition de la boucle If.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Je voudrai pouvoir sélectionner une ligne dans le datagridview avec un clic droit avant de pouvoir ouvrir le menu mais je sais pas comment faire !!

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Solutions :

    Pour la sélection de la ligne avec clic droit :
    http://www.developpez.net/forums/d54...ew-clic-droit/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub dgv_CellMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
            'un try ... catch pour eviter une exception au clic sur une entete        
            Try
                DataGridView1.Rows(e.RowIndex).Selected = True
            Catch ex As ArgumentOutOfRangeException
     
            End Try
        End Sub
    Une fois ma ligne sélectionné, il est plus facile d'ouvrir un menu sur cette ligne et de savoir en meme temps quel ligne a était selectionner pour mieux pouvoir agir dessus.

    Voila le code qui de procédure "ouvrir un menu", qui verie quel ligne est sélectionné pour ouvrir un menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub OuvrirMenu()
            ' Create a new ContextMenuStrip control.
            Dim z As Integer
            ContextMenuStrip1 = New ContextMenuStrip()
            AddHandler ContextMenuStrip1.Opening, AddressOf cms_Opening
     
            For z = 0 To i - 1
                If DataGridView1.Rows(z).Selected = True Then
                    DataGridView1.Rows(z).ContextMenuStrip = ContextMenuStrip1
                End If
            Next
     
        End Sub
    En plus lorsque j'ai de nouvelle ligne qui son inséré pendant un clic droit, la ligne sélectionné reste selectionné meme si elle change de place.

    Merci beaucoup a toute les personnes qui m'ont aidé !!

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

Discussions similaires

  1. Titre et items d'un menu tout sur une ligne
    Par alex2746 dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 06/09/2013, 12h01
  2. menu horizontal sur une ligne
    Par balsamique dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 02/06/2011, 19h26
  3. Réponses: 4
    Dernier message: 14/08/2008, 16h34
  4. Menu que sur une ligne
    Par le-baron dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/03/2008, 17h22
  5. Création d'un menu sur une ligne de JTable
    Par devAd dans le forum Composants
    Réponses: 3
    Dernier message: 16/11/2006, 10h49

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