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 :

sélection multiples dans un datagridview


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut sélection multiples dans un datagridview
    Bonjour,

    j'ai un bout de code qui me créer à la volée un datagridview (et le rempli bien évidemment).
    J'aimerai adjoindre une fonctionnalité, à savoir: pouvoir sélectionner plusieurs cellules concomitante ou pas et afficher dans une boite type info bulle, la somme (ou autre opération mathématique) du contenu de ces cellules.


    j'ai donc trouvé la propriété "MyDataGridView.CurrentCell "
    mais mon 1er soucis est de savoir ou je dois mettre mon code sachant que mon datagrid n'existe pas tant qu'il n'a pas été généré.

    J'espère avoir été assez clair, et merci pour votre aide,

    Kirk

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Il faut :
    - gérer l'event SelectionChanged du DataGridView,
    - dans le code de cet event, on utilisera la propriété SelectedCells du DataGridView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DGV1.SelectionChanged += new EventHandler(DGV1_SelectionChanged);
    ...
    private void DGV1_SelectionChanged(object sender, EventArgs e)
    {
       for (i = 0; i < DGV1.SelectedCells.Count; i++)
          .... // le traitement de la selection
    }

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    je paraphrase Graffito.
    Traduit en vb.net, ça pourrait ressembler à ça :
    Abonnement à l'événement SelectionChanged, après la création du Dgv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            AddHandler MonDgvFraichementCree.SelectionChanged, AddressOf Dgv_SelectionChanged
    et l'événement :
    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
        Private Sub Dgv_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles DataGridView1.SelectionChanged
     
            Dim dgv As DataGridView = CType(sender, DataGridView)
     
            If dgv.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
                Dim somme As Single = 0
                For Each cell As DataGridViewCell In dgv.SelectedCells
                    somme += CSng(cell.Value)
                Next
     
                '*** Pour tester :
                TextBox1.Text = CStr(somme)
     
            End If
     
        End Sub

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut
    Bonsoir,

    merci pour votre aide,

    c'est à peu près cela que je désirais.

    je me heurte cependant à un bug lors de l’exécution.
    pour info, dans mon data grid j'ai des données financières et des dates.
    Or quand j’exécute le bout de code qui va me créer un datagrid, j'obtiens un bug car il y a déjà une cellule sélectionnée et bien sur c'est une date.

    le but serait de ne sélectionner que ce que j'ai décidé de sélectionner (pas la cellule sélectionnée par défaut)
    je ne comprends pas pourquoi cela bug puisque l'on est sur un selectionchange.

    de plus je souhaiterais afficher le résultat sous forme d'une bulle (outil tooltip)

    merci pour votre aide encore une fois

    K

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Avant de faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme += CSng(cell.Value)
    il faut tester si dgv.Colums[cell.Column] correspond à une colonnne à sommer (ou simplement vérifier le type de Cell.Value).

    Pour le tooltip, on peut affecter à toutes les cellules sélectionnées le texte choisi (mettre préalablement à true la propriété DataGridView.ShowCellToolTips).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell.ToolTipText = "Mon total est de xxx" ;
    Attention, il faudra mémoriser la liste des cellules avec Tooltip pour pouvoir supprimer le tooltip dès que la sélection change.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    je continue à paraphraser Graffito avec ce code :
    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 Dgv_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles DataGridView1.SelectionChanged
     
            Dim dgv As DataGridView = CType(sender, DataGridView)
     
     
            If dgv.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
                Dim somme As Single = 0
     
                For Each cell As DataGridViewCell In dgv.SelectedCells
                    Dim numeroCol As Integer = cell.ColumnIndex
                    If numeroCol = 3 OrElse numeroCol = 4 Then
                        somme += CSng(cell.Value)
                    End If
                Next
     
                '*** Pour tester :
                TextBox1.Text = CStr(somme)
            End If
        End Sub
    Ici, par exemple, seules les colonnes 3 et 4 sont prises en compte.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut
    Bonsoir et merci encore pour votre aide.

    J'ai encore 2 questions:
    1) pourquoi créer un datagrid (Dim dgv As DataGridView = CType(sender, DataGridView) sachant que j'en ai déjà créer un auparavant.
    Je vois pas trop

    2)Je vois pas non plus ou placer un code du genre:
    cell.ToolTipText = "Mon total est de " & somme
    sachant que la variable "cell" n'existe que dans la boucle.

    merci pour votre retour,
    K

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonsoir,
    pour la première question, et selon mes connaissances, on ne créé pas un nouveau Dgv, on indique que sender as Object de l'événement, déclaré dgv dans la routine est un DatagridView.
    Sender est Object (type de tous les types) et pourrait être un contrôle Calendar, ComboBox etc... (tout ctrl doté de l'évent SelectionChanged).
    Cette déclaration correspond au Handless classique qui déclare le contrôle concerné comme abonné à l'événement.
    A noter qu'on peut s'en passer avec Option Strict sur Off. (A éviter pour sauver VB).

  9. #9
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    2)Je vois pas non plus ou placer un code du genre:
    cell.ToolTipText = "Mon total est de " & somme
    sachant que la variable "cell" n'existe que dans la boucle.
    Dans l'event, après le calcul, dans une deuxime boucle sur les cellules selectionnées dans une boucle en prenant soin aussi de conserver dans une Liste de points les coordonnées de la cell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaListeDePoints.Add(new Point[cell.ColumnIndex,cell.RowIndex])
    de façon à faire au début du Dgv_SelectionChanged une boucle sur cette liste pour supprimer les tool tip précédents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i=0;i<MaListeDePoints.Count;i++) 
     MonDgv.Rows[MaListeDePoints[i].Y].Cells[MaListeDePoints[i]].ToolTipText=null ;
    MaListeDePoints.Clear() ;

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut
    BOnjour,

    j'ai essayé de mettre en place la solution.

    voici tout le code du selectionchanged:
    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
     
     
                    Dim dgv As DataGridView = CType(sender, DataGridView) 'permet d'informer que le sender est un datagridview
            If dgv.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
                Dim somme As Single = 0
                Dim malistedepoints As Object = 0
     
                For Each cell As DataGridViewCell In dgv.SelectedCells
                    Dim numeroCol As Integer = cell.ColumnIndex
                    If numeroCol = 3 OrElse numeroCol = 4 OrElse numeroCol = 5 OrElse numeroCol = 6 Then
                        malistedepoints.Add(New Point(cell.ColumnIndex, cell.RowIndex))
                        somme += CSng(cell.Value)
                        cell.ToolTipText = somme
     
                    End If
                Next
     
     
            End If
    comme vous le voyez, j'ai commencé simple (pas de remise à zero de la variable contenant la liste de points)

    mais j'ai déjà une erreur d’exécution lorsque je sélectionne plusieurs points:
    Le membre public 'Add' du type 'Integer' est introuvable.
    je ne sais pas si j'ai choisis le bon type de variable pour "malistedepoints"

    pouvez vous m"éclairer ?

    merci d'avance,

    K

  11. #11
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Le problème vient de
    malistedepoints As Object
    : il faudrait déclarer une List de Point.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut
    Bonsoir,

    je reviens vers vous pour le même soucis.

    Je continue de sécher.

    Graffito, peux tu me donner plus d'explications ?

    voici ce que j'ai fait d'après ce que j'ai trouvé:

    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
     
            Dim dgv As DataGridView = CType(sender, DataGridView) 'permet d'informer que le sender est un datagridview
            If dgv.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
                Dim somme As Single = 0
     
     
                For Each cell As DataGridViewCell In dgv.SelectedCells
                    Dim x As Integer = cell.RowIndex
                    Dim y As Integer = cell.ColumnIndex
                    If y = 3 OrElse y = 4 OrElse y = 5 OrElse y = 6 Then
                        Dim malistedepoints() As Point = New Point() {New Point(x, y)}
                        somme += CSng(cell.Value)
                        cell.ToolTipText = somme
                    End If
                Next
     
     
            End If
    malheureusement ça ne fonctionne pas comme je l'entends.
    Tout d'abord mon tooltip n'est pas réinitialisé (en fait je vois pas trop vu mon code ou placer la réinitialisation du tooltip)

    Ensuite autre pb: je vais par exemple sélectionner plusieurs cellules, et bien si je passe ma souris sur l'une des cellules sélectionnées je n'aurai pas le même résultat d'un cellule à l'autre.

    J'y comprends rien.

    merci pour vos éclaircissements

    K

  13. #13
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Il faut 2 boucles sur les SelectedCells : une première pour calculer la somme, une deuxème pour mettre les ToolTips.

    La liste de points doit être créée au niveau du AddHandler et les points ajoutés à la liste dans la deuxième boucle sur les cellules selectionnées.

    De plus, avant de faire la première boucle, on doit traiter la listes de points afin de réinitialiser les tooltips remplis lors du précédent appel de l'event SelectionChanged, puis la "clearer" .

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut
    Bonsoir,

    je sèche toujours autant sur ce truc.
    j'essaie déjà de me focaliser sur le tooltip (pour la réinitialisation on verra après)

    voici mon code:
    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
     
            'Bout de code pour sélection multiple dans le datagridview sur un popup
     
            Dim dgv As DataGridView = CType(sender, DataGridView) 'permet d'informer que le sender est un datagridview
            Dim somme As Single = 0
            If dgv.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
     
                For Each cell As DataGridViewCell In dgv.SelectedCells
                    Dim x As Integer = cell.RowIndex
                    Dim y As Integer = cell.ColumnIndex
                    Dim nbselection As Int16 = dgv.GetCellCount(DataGridViewElementStates.Selected)
     
                    If y = 3 OrElse y = 4 OrElse y = 5 OrElse y = 6 Then
                        Dim malistedepoints() As Point = New Point() {New Point(x, y)}
                        somme += CSng(cell.Value)
                        nbselection -= 1
                    End If
     
                    If nbselection = 0 Then
                        cell.ToolTipText = somme
                    End If
                Next
            Else
                End
            End If
     
        End Sub
    je suis partie sur l'ajout d'une variable (nbselection) mais ça ne fonctionne pas. J'ai uniquement mon tooltip sur la 1ère cellule.

    je comprends pas l’intérêt d'une 2nde boucle.
    peux tu être plus explicite (idéalement avec un bout de code) ?

    merci de votre aide,

    K

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonsoir,
    Ce que Graffito dit, avec quelques explications dans le code :
    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
        'Déclaration de la liste de points,  hors procédure pour garder les dernières données. (Portées des variables).
        Dim MaListeDePoints As New List(Of Point)
     
        Private Sub Dgv_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles DataGridView1.SelectionChanged
     
            Dim dgv As DataGridView = CType(sender, DataGridView)
     
            'Ici 1ère boucle pour annuler les toolTipText précédents qui, persistants, restent attachés à la cellule.
            'C'est pour cela que la déclaration de la liste est hors procédure.
            'Sa portée permet d'avoir accès à la manœuvre précédente et de l'annuler.
            For i As Integer = 0 To MaListeDePoints.Count - 1
                dgv.Rows(CInt(MaListeDePoints(i).Y)).Cells(CInt(MaListeDePoints(i).X)).ToolTipText = Nothing
            Next
            'Nettoyage de la liste précédente.
            MaListeDePoints.Clear()
     
            'Création d'une nouvelle liste.
            If dgv.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
                Dim somme As Single = 0
                Dim cell As DataGridViewCell = Nothing
     
                For Each cell In dgv.SelectedCells
                    Dim numeroCol As Integer = cell.ColumnIndex
                    If numeroCol = 3 OrElse numeroCol = 4 Then
                        somme += CSng(cell.Value)
                        MaListeDePoints.Add(New Point(cell.ColumnIndex, cell.RowIndex))
                    End If
                Next
     
                '*** Pour tester :
                For i As Integer = 0 To MaListeDePoints.Count - 1
                    dgv.Rows(CInt(MaListeDePoints(i).Y)).Cells(CInt(MaListeDePoints(i).X)).ToolTipText = CStr(somme)
                Next
            End If
     
        End Sub

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 148
    Par défaut
    Super, merci chrismonoy.

    Ça fait des semaines que je bloquait dessus.

    en fait c'est la partie cell.tooltip que j'avais compris de travers.
    J'imaginais avoir un tooltip global pour mes cellules sélectionnées; or j'en ai un pour chaque cellule sélectionnée.

    c'est plus clair.

    Je vais peut être remplacer les tooltips par un label en abs de page à la manière d'un excel par exemple. Je crois que ce sera plus parlant.
    Mais bon j'ai au moins le principe.

    Merci beaucoup.

    juste une petite précision:
    dans la partie sélection des colonnes pour vérifier si le code s’applique ou pas. N'y a-t-il pas possibilité de raccourcir la ligne
    actuellement j'ai une série de colonne pour lesquelles le code doit s’exécuter et donc un paquet de "orelse".
    S'il y avait un truc plus court ?

    merci d'avance,

    K

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    il y a possibilité de faire une liste des numéros des colonnes concernées par l'addition, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim colonneAddition() As Integer = {3, 4, 5}
    Puis de contrôler si la colonne de la cellule examinée appartient à cette liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    If colonneAddition.Contains(numeroCol) Then 'numeroCol = 3 OrElse numeroCol = 4 Then
                        somme += CSng(cell.Value)
                        MaListeDePoints.Add(New Point(cell.ColumnIndex, cell.RowIndex))
                    End If

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

Discussions similaires

  1. Sélection multiple dans un sous formulaire ?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2019, 01h05
  2. Sélection multiples dans datagridview
    Par NoussaL dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/10/2008, 13h45
  3. Sélection Multiple dans une JTable
    Par bobic dans le forum Composants
    Réponses: 3
    Dernier message: 07/08/2006, 17h35
  4. sélection multiple dans plusieurs zones de liste
    Par malabar92 dans le forum Access
    Réponses: 2
    Dernier message: 16/05/2006, 01h08
  5. [Débutant] Sélection multiples dans une Listbox
    Par eraim dans le forum Access
    Réponses: 4
    Dernier message: 15/10/2005, 03h21

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