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 :

Ouvrir un menu sur l'entete d'une colonne d'un DGV


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 Ouvrir un menu sur l'entete d'une colonne d'un DGV
    Bonjour,

    J'ai un ensemble de procédure qui me permet d'ouvrir un menu (clic droit) uniquement sur les lignes de mon DGV grace à un "try" que j'ai trouvé dans une solution. Je suis pas un pro avec les "Try" et je voudrai réaliser quasi la même fonctionnalité sauf que cette fois je veux que le menu s'ouvre en dessous de l’entête de la colonne de mon DGV.

    Voila mon code initial qui ouvre un menu sur une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        '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.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
     
            If e.Button = MouseButtons.Right Then ' Lorsqu'on fait un click *droit*
                'un try ... catch pour eviter une exception au clic sur une entete        
                Try
                    DataGridView1.Rows(e.RowIndex).Selected = True
                    OuvrirMenu(e.RowIndex) 'Ouvre un menu
                Catch ex As ArgumentOutOfRangeException
                End Try
     
            End If
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        'Procedure qui permet d'ouvrir un menu
        Private Sub OuvrirMenu(ByVal e As Object)
            ' Create a new ContextMenuStrip control.
            Dim z As Integer
            ContextMenuStrip1 = New ContextMenuStrip()
            AddHandler ContextMenuStrip1.Opening, AddressOf cms_Opening
     
            For z = 0 To DataGridView1.RowCount - 1
                If DataGridView1.Rows(z).Selected = True Then
                    DataGridView1.Rows(z).ContextMenuStrip = ContextMenuStrip1
                End If
            Next
        End Sub
    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
        'Procedure qui contient ce qui ce trouve dans le menu
        Private Sub cms_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
            Dim c As Control = ContextMenuStrip1.SourceControl
            Dim tsi As ToolStripDropDownItem = ContextMenuStrip1.OwnerItem
     
            ContextMenuStrip1.Items.Clear()
            ContextMenuStrip1.Items.Add("Acknowledge Alarm")
            AddHandler ContextMenuStrip1.Items(0).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("Detail Display")
            AddHandler ContextMenuStrip1.Items(1).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("Associated Display")
            AddHandler ContextMenuStrip1.Items(2).Click, AddressOf cms_Click
     
            e.Cancel = False
        End Sub
    Merci d'avance pour vos suggestions.

    Voila ce que je souhaite réaliser :
    Nom : TesteFiltre2.png
Affichages : 100
Taille : 25,0 Ko

  2. #2
    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 viens de voir l'event "ColumnHeaderMouseClick", je me penche dessus et je met une solution si j'en trouve une !!

  3. #3
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Je suis curieux pour ton try catch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Try
                    DataGridView1.Rows(e.RowIndex).Selected = True
                    OuvrirMenu(e.RowIndex) 'Ouvre un menu
                Catch ex As ArgumentOutOfRangeException
                End Try
    Pourquoi tu n'essayes pas de corriger pour qu'il n'y ai plus l'excpetion plutôt que juste passer outre ? (Ce n'est pas une critique ! Je sais que parfois cette méthode est inévitable, mais en général, et surtout pour ma part, j'essaye de l'éviter autant que possible. )

    Sinon oui tu es parti dans la bonne direction avec ColumnHeaderMouseClick, tu testes que e.Button = Windows.Forms.MouseButtons.Right, et tu déroules ton menu.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  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
    Voila mon code pour le nouveau menu sur l’entête, le code marche bien mais j'ai aucun menu qui s'ouvre sur l’entête, j'ai bien pris le soin de désactiver le Tri sur les colonnes :

    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
        Private Sub dataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
            If e.Button = MouseButtons.Left Then
                OuvrirMenuColonne(e.ColumnIndex)
            End If
        End Sub
        'Procedure qui permet d'ouvrir un menu
        Private Sub OuvrirMenuColonne(ByVal e As Object)
            ContextMenuStrip2 = New ContextMenuStrip()
            AddHandler ContextMenuStrip2.Opening, AddressOf cms2_Opening
            DataGridView1.Columns(e).ContextMenuStrip = ContextMenuStrip2
        End Sub
     
        'Procedure qui contient ce qui ce trouve dans le menu
        Private Sub cms2_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
            Dim c As Control = ContextMenuStrip2.SourceControl
            Dim tsi As ToolStripDropDownItem = ContextMenuStrip2.OwnerItem
     
            ContextMenuStrip2.Items.Clear()
            ContextMenuStrip2.Items.Add("All Priorities")
            AddHandler ContextMenuStrip2.Items(0).Click, AddressOf cms_Click
            ContextMenuStrip2.Items.Add("Like Currently Selected")
            AddHandler ContextMenuStrip2.Items(1).Click, AddressOf cms_Click
            ContextMenuStrip2.Items.Add("-")
            ContextMenuStrip2.Items.Add("Urgent")
            AddHandler ContextMenuStrip2.Items(3).Click, AddressOf cms_Click
            ContextMenuStrip2.Items.Add("High")
            AddHandler ContextMenuStrip2.Items(4).Click, AddressOf cms_Click
            ContextMenuStrip2.Items.Add("Low")
            AddHandler ContextMenuStrip2.Items(5).Click, AddressOf cms_Click
            ContextMenuStrip2.Items.Add("-")
            ContextMenuStrip2.Items.Add("Sort Ascending")
            AddHandler ContextMenuStrip2.Items(7).Click, AddressOf cms_Click
            ContextMenuStrip2.Items.Add("Sort Desscending")
            AddHandler ContextMenuStrip2.Items(8).Click, AddressOf cms_Click
            e.Cancel = False
        End Sub



    PS: je viens de trouver mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            DataGridView1.Columns(e).ContextMenuStrip = ContextMenuStrip2
    Cette ligne de code na pas de sens car les colonnes n'ont la propriétés ContextMenuStrip ^^

    Merci d'avance pour vos suggestions, perso j'ai pensé à ouvrir le menu directement sous la colonne sélectionné grâce au coordonnée de l’entête de la colonne sélectionné mais je sais pas si c'est vraiment catholique de faire ce genre de manipe, peut être qu'il existe des solutions déjà existantes.

  5. #5
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Tu peux récupérer e.Location pour connaitre la position du curseur au moment du clic, et le passer à ta fonction OuvrirMenuColonne(e as Object, positionCurseur as Point)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub dataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
            If e.Button = MouseButtons.Left Then
                OuvrirMenuColonne(e.ColumnIndex, e.Location)
            End If
        End Sub
        'Procedure qui permet d'ouvrir un menu
        Private Sub OuvrirMenuColonne(ByVal e As Object, ByVal positionCurseur As Point)
     
            '...
            ContextMenuStrip2.Show(positionCurseur)
        End Sub
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  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
    Merci beaucoup sa me sera sans doute utile vu ce que je vais écrire !!

    Alors j'ai résolu mon probleme, maintenant j'arrive a ouvrir un menu, a la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView1.Columns(e).ContextMenuStrip = ContextMenuStrip2
    j'ai mi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ContextMenuStrip = ContextMenuStrip2
    Mon menu s'ouvre bien sur la bonne colonne mais il s'ouvre pas dessous la colonne comme dans l'exemple de ma photo du post1, en gros il s'ouvre sur la location de la souris.

    J'ai ensuite un second problème, mon menu ne s'ouvre que sur le clic droit alors que j'ai mi une boucle If pour le bouton gauche !! Je trouve cela bizar !!


    PS: pour répondre a ton post, je devrai plutôt faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ContextMenuStrip2.Show(positionColonne)
    Avec positionColonne que je devrai normalement retrouvé avec l'index de la colonne ???

  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
    Il faut que j'arrive a retrouver les coordonnées de l'entete de colonne cliqué et à calculer les coordonnées X et Y dessous cette colonne en fonction l'épaisseur de l'entete genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X=LocationEnteteColonneHorizontal
    Y=LocationEnteteColonneVertical + EpaisseurEnteteColonne
    ContextMenuStrip2.Show(X,Y)
    Alors mon souci serai de retrouvé les trois propriétés suivante :
    - Épaisseur Entête. (DataGridView.ColumnHeadersHeight)
    - Location Verticale Entête de la colonne voulu.
    - Location Horizontal Entête de la colonne voulu.

  8. #8
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Au temps pour moi je n'avais pas vu que tu souhaitais l'afficher sous le header de la colonne spécifié.

    Donc on continue d'envoyer e.ColumnIndex à notre OuvrirMenuColonne pour savoir sur quelle colonne on est, mais maintenant la position du curseur n'est plus utile (ou pour le moment).

    Tout d'abord, on récupère le rectangle de dessin de la cellule avec GetCellDisplayRectangle(LaColonne, LaLigne (ici -1 en dur car c'est le header), False(pour le cutOverFlow mais c'est pas important ici))

    Et avec ce rectangle, on peut récupérer sa Location(x,y) dans le datagridview, il ne suffit que de rajouter la largeur du header pour l'afficher sous la celulle.


    Et enfin dans notre OuvrirMenuColonne, on va faire contextmenustrip2.show(Datagridview1 as DataGridView, positionMenu as Point)


    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
     
        Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
     
            OuvrirMenuColonne(e.ColumnIndex, e.Location)
     
        End Sub
     
        Private Sub OuvrirMenuColonne(ByVal e As Object, ByVal positionCurseur As Point)
                   Dim positionMenu As Point
            Dim cellule As Rectangle
     
     
            cellule = DataGridView1.GetCellDisplayRectangle(e, -1, False)
     
     
            positionMenu = New Point(cellule.Location.X, cellule.Location.Y + DataGridView1.ColumnHeadersHeight)
     
            contextmenustrip2.Show(DataGridView1, positionMenu)
        End Sub

    EDIT: Par contre j'ai pas bien saisi quand tu dis
    J'ai ensuite un second problème, mon menu ne s'ouvre que sur le clic droit alors que j'ai mi une boucle If pour le bouton gauche !! Je trouve cela bizar !!
    Tu veux que ton menu se déroule au clic gauche ?
    Peut-on voir la portion de code mise en cause ?
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  9. #9
    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 pour ta solution, je teste sa dans la matiné, sa l'air super cohérent en plus, je te remercie beaucoup.

    Pour le souci avec le clic gauche, j'ai simplement mi une boucle If dans mon event ColumnHeaderMouseClick.

    Voila la portion de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub dataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
            If e.Button = MouseButtons.Left Then
                OuvrirMenuColonne(e.ColumnIndex)
            End If
        End Sub
    En tous cas merci d'avance pour tes solutions !!

  10. #10
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Citation Envoyé par dragondumond Voir le message
    Pour le souci avec le clic gauche, j'ai simplement mi une boucle If dans mon event ColumnHeaderMouseClick.
    Attention un if n'est pas une boucle !


    Citation Envoyé par dragondumond Voir le message
    Voila la portion de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub dataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
            If e.Button = MouseButtons.Left Then
                OuvrirMenuColonne(e.ColumnIndex)
            End If
        End Sub
    Et cette portion ne marche pas ? On ne rentre pas dans la sub au clic gauche ?

    [HUMOUR] Fais 180° avec ta souris ? [/HUMOUR]

    Tu m'as fait douté donc j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
            If e.Button = Windows.Forms.MouseButtons.Left Then
                MsgBox("1")
            ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
                MsgBox("2")
            End If
        End Sub
    Mais tout fonctionne normalement chez moi ... J'ai 1 quand je clic gauche et 2 quand je clic droit ...


    De rien et bon courage
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  11. #11
    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
    Bizarrement, le bouton clic gauche marche bien aujourd’hui lol, il y a des jours ou j'ai l'impression d’être connecté a skynet (étape1: résolution automatique du programme, étape2: Exterminer tous les ....)

    Bon voila la solution :

    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
        Private Sub dataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
            If e.Button = MouseButtons.Left Then
                OuvrirMenuColonne(e.ColumnIndex, e.Location)
            End If
        End Sub
     
        Private Sub OuvrirMenuColonne(ByVal e As Object, ByVal positionCurseur As Point)
            Dim positionMenu As Point
            Dim cellule As Rectangle
            ContextMenuStrip2 = New ContextMenuStrip()
            AddHandler ContextMenuStrip2.Opening, AddressOf cms2_Opening
            cellule = DataGridView1.GetCellDisplayRectangle(e, -1, False)
            positionMenu = New Point(cellule.Location.X, cellule.Location.Y + DataGridView1.ColumnHeadersHeight)
            contextmenustrip2.Show(DataGridView1, positionMenu)
        End Sub

  12. #12
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Y'a des jours comme ça ...

    Nb : N'oublie pas qu'AddHandler va de paire avec RemoveHandler !

    Bon courage
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/05/2010, 01h43
  2. Réponses: 3
    Dernier message: 20/07/2007, 11h33
  3. filtre WHERE sur premier caractère d'une colonne
    Par Maljuna Kris dans le forum Requêtes
    Réponses: 8
    Dernier message: 20/11/2005, 18h52
  4. Index sur le contenu d'une colonne XMLTYPE
    Par haugoyard dans le forum Oracle
    Réponses: 7
    Dernier message: 11/04/2005, 11h10
  5. [C#] [WinForms] Evènement sur le tri d'une colonne
    Par beway dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/03/2005, 16h43

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