Trier un DataGridView sur plusieurs colonnes [Résolu]

Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
- - Dernière réponse : scn68100
Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
- 2 sept. 2019 à 09:10
Bonjour,
Je voudrai donner à l'utilisateur de trier le DataGridView sur le chiffre d'affaire descendant ET une date en ascendant
Je fais donc le tri sur la colonne chiffre d'affaire, puis sur la colonne date
Mais cela ne marche pas ...

Comment trier sur plusieurs colonnes ?

En dernier recours, je rajouterai ces champs dans la table, et je trierai la table, mais je veux éviter cela
Merci d'avance

Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322
1
Merci
Bon j'ai réussi à tout remettre en marche, le mac avait "oublié" que virtualBox est une application autorisé à trifouiller au système.
Mais le temps que je trouve le bon post sur le net expliquant comment régler le problème, l'après midi est passé.....

Je pars du principe que tu as lu le tuto et testé le projet.

j'ai écrit une classe que j'ai appelé LaClassDeScn. Elle dispose des 4 propriétés qui seront affichées dans le datagridview.
La classe implémente INotifyPropertyChanged pour interagir rapidement avec le binding.

Imports System
Imports System.ComponentModel

Class LaClassDeScn
    Implements INotifyPropertyChanged
    ''<summary>
    '' Construit une instance à partir des paramètres d'entrée, ceux ci peuvent être issus de la BDD ou d'ailleur
    '' </summary>
    '' <param name="LaDate"></param>
    '' <param name="ChiffreAffaire"></param>
    '' <param name="LaCondition"></param>
    Public Sub New(ByVal LaDate As DateTime, ByVal ChiffreAffaire As Double, ByVal LaCondition As String)
        MaDate = LaDate
        CA = ChiffreAffaire
        Condition = LaCondition
    End Sub

    Private laDate As DateTime
    '' <summary>
    '' Date issue de la BDD et affichée dans le Datagriview
    '' </summary>
    Public Property MaDate As DateTime
        Get
            Return laDate
        End Get
        Set(ByVal Value As DateTime)
            If laDate <> Value Then
                laDate = Value
                GenerePropertyChanged("Date")
            End If
        End Set
    End Property

    Private chiffreAffaire As Double
    '' <summary>
    '' Chiffre d'affaire issu de la BDD et affiché dans le datagridview
    '' </summary>
    Public Property CA As Double
        Get
            Return chiffreAffaire
        End Get
        Set(ByVal Value As Double)
            If chiffreAffaire <> Value Then
                chiffreAffaire = Value
                GenerePropertyChanged("CA")
            End If
        End Set
    End Property

    Private laCondition As String
    '' <summary>
    '' Condition à vérifier lors du click sur la case à cocher
    '' </summary>
    Public Property Condition As String
        Get
            Return laCondition
        End Get
        Set(ByVal Value As String)
            If laCondition <> Value Then
                laCondition = Value
                GenerePropertyChanged("Condition")
            End If
        End Set
    End Property

    Private caseAcocher As Boolean
    '' <summary>
    '' Propriété correspondant au checkbox
    '' </summary>
    Public Property Coche As Boolean
        Get
            Return caseAcocher
        End Get
        Set(ByVal Value As Boolean)
            If caseAcocher <> Value Then
                If Condition = "A" Then 'on vérifie la condition, le champ n'est mis à jour que si elle est ok
                    caseAcocher = Value
                End If

                'qu'elle soit bonne ou pas on signale au binding un changement, ainsi la coche dans le datagridview sera effacée si besoin
                GenerePropertyChanged("Coche")
            End If
        End Set
    End Property


#Region "INotifyPropertyChanged"
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Private Sub GenerePropertyChanged(ByVal Propriete As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propriete))
    End Sub

#End Region
End Class



Dans le formulaire, d'abord on charge la liste et on l'affiche
   Private lesDonnees As List(Of LaClassDeScn) = New List(Of LaClassDeScn) 'déclaration de la collection

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'pour l'exemple, je crée une liste de LaClassDeScn en dur dans le code.
        'si tu optes pour cette méthode, tu créeras cette liste à partir de ta base de données, en boucle au lieu de charger le datagridview
        lesDonnees.Add(New LaClassDeScn(DateTime.Parse("01/09/2019"), 40.9, "Konichiwa"))
        lesDonnees.Add(New LaClassDeScn(DateTime.Parse("01/09/2019"), 27.3, "Coucou"))
        lesDonnees.Add(New LaClassDeScn(DateTime.Parse("01/09/2019"), 30.5, "Hello"))
        lesDonnees.Add(New LaClassDeScn(DateTime.Parse("01/08/2019"), 17.4, "A"))
        lesDonnees.Add(New LaClassDeScn(DateTime.Parse("01/08/2019"), 38.1, "Hallo"))
        lesDonnees.Add(New LaClassDeScn(DateTime.Parse("01/08/2019"), 6, "Guten tag"))
        'ici on on affecte la liste comme source de donnée du bindingSource
        LaClassDeScnBindingSource.DataSource = lesDonnees 'pour l'affichage par défaut rien d'autre à faire




Ensuite dans un bouton, on mets la ligne de code pour le tri
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'tri par date croissante, puis par CA décroissant
        LaClassDeScnBindingSource.DataSource = lesDonnees.OrderBy(Function(x) x.MaDate).ThenByDescending(Function(x) x.CA) 'et ya rien d'autre à faire        End Sub
End Sub


On lance l'application et ceci s'affiche

Si je clique sur une case à cocher dont la propriété Condition ne vaut pas "A", on voir le petit crayon en début de ligne, la case est cochée

Si je change de case, pour cloturer la saisie, la case est décochée


A l'inverse pour la ligne où Condition vaut "A", ça reste coché


Et quand on clique sur le bouton de tri, la coche est toujours active

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322
0
Merci
Bonjour
Entre ta base de données et le datagridview utilises tu une classe métiers dont la collection bindée sur le datagridview ?
Commenter la réponse de Whismeril
Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
0
Merci
Bonjour,
Hum, honnêtement, je n'ai pas compris le message ...
Je n'ai ps de lien direct entre le datagridview et la base
Je fait une boucle de lecture sur la base, et au fur et a mesure je remplit le datagrid

J'ai une autre raison de vouloir trier le datagridview et non la table
C'est que l'utilisateur peut cocher plusieurs lignes avant de demander le changement de tri
Si je relance une lecture avec tri, je vais perdre les coches qu'il a fait ...
Commenter la réponse de scn68100
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322
0
Merci
VB.Net est un langage tout objet.
L’idée de base est donc d’écrire et d’utiliser des objets modélisant les actions à réaliser.
C’est une notion un peu difficile à appréhender au début, et peut-être encore plus quand on vient de Vb6 (ou 5, 4, etc...)/VBA car avec le même nom on pense que c’est une continuation mais non.

Je t’invite à lire cet article sur le binding en winform (en WPF c’est encore plus performant mais y a pas de datagridview en WPF donc tu codes en binding)
https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource

Et si tu viens effectivement de vb6 tu peux aussi lire ceci
https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net

De mon côté, je vais te faire un petit exemple qui répond à tes 2 questions.
Whismeril
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322 -
Ha j'ai un soucis avec ma virtualbox, je ne vais peut-être pas pouvoir te faire l'exemple aujourd'hui
Commenter la réponse de Whismeril
Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
0
Merci
Merci de votre aide
Je connais cette méthode
Je peut la rendre en lançant une lecture avec tri de la table
Mais je ne peux le faire pour deux raisons
1 - Si je recharge le DataGridView, je vais perdre la connaissance des cases qui ont été cochées
2 - J'ai crypté mes informations avant de les écrire, aussi je suis obligé de les décrypter avant de les utiliser, donc je ne peux automatiser la lecture ou l'écriture

Je ne peux également mettre mes critères de tri dans une colonne cachée, car je dois trier un montant par ordre décroissant, et un date par ordre croissante ....

Il a certainement une possibilité de trier un DataGridView sur plus d'une colonne
Malheureusement les pistes que je trouve sont en C et je n'arrive pas a les utiliser
Cordialement
SC
Commenter la réponse de scn68100
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322
0
Merci
Je peut la rendre en lançant une lecture avec tri de la table

non justement, c'est décoléré de la table.

1 - Si je recharge le DataGridView, je vais perdre la connaissance des cases qui ont 2 - J'ai crypté mes informations avant de les écrire, aussi je suis obligé de les décrypter avant de les utiliser, donc je ne peux automatiser la lecture ou l'écriture été cochées

aucun soucis avec ces 2 points.

Je n'arrive toujours pas à faire fonctionner ma virtual box, ni à la réinstaller.
J'ai lancé un scan "profond" d'antivirus pour voir.

Commenter la réponse de Whismeril
Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
0
Merci
Ha, c'est tentant ...
Je vais essayer d'étudier le lien du binding
Mais je suis en Visual Studio 2008 Professionel, j'espère pourvoir le faire
Car dans mes expériences passées, quand on liait un DataGrigView a une table, cela devenait automatique

J'attend l'exemple ....
Commenter la réponse de scn68100
Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
0
Merci
Bonjour,
Merci beaucoup pour cette aide
Je vais essayer d'adapter cette CLASSE ....
Je ne manquerai pas de rendre compte
Commenter la réponse de scn68100
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322
0
Merci
de rien
Commenter la réponse de Whismeril
Messages postés
146
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
19 septembre 2019
Commenter la réponse de scn68100