Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > VB.NET
VB.NET Forum d'entraide sur la programmation Visual Basic .NET. Avant de poster -> FAQ VB.NET, Articles VB.NET, Sources VB.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/12/2012, 13h57   #1
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Par défaut Trier une colonne d'un Datagridview

Bonjour,

Je souhaiterai pouvoir trier par ordre croissant ou décroissant ma "Columns(0)" soit à l'aide de 2 button soit par l'entête de la colonne si cela en est possible ?

Ma "Columns(0)" comporte 10 lignes numérotées de 1 à 10

Je m'apercois dans Columns -> Séléction de la colonne -> ShortMode= Automatic
(Pour les colonnes ou je ne souhaites pas que l'utilisateur les tries je les passeraient en "NotSortable)

J'ai trouvé ceci comme exemple : http://msdn.microsoft.com/fr-fr/libr.../0868ft3z.aspx

mais je n'arrive pas à l'assigner sur ma colonne en question
Avez-vous une idée ?

Merci
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 14h16   #2
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 228
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 228
Points : 558
Points : 558
Salut,

Au risque de ne pas avoir compris ce que tu voulais faire,

quand tu met la propriété .SortMode sur Automatic, lorsque tu clique sur l'entête de la colonne ça te trie les données

quand tu met la propriété .SortMode sur Programmatic, c'est toi qui doit gérer le tri de la colonne avec des bouttons par exemple mais le tout par code.

Et pour finir, en mettant NotSortable, les colonnes ne se trieront jamais.

J'avais mal lu ton post. Si tu veux vraiment te servir de bouttons pour trier tes colonnes, met la propriété .SortMode de tes colonnes sur Programmatic puis
utilise la méthode .Sort() de ton DataGridView en lui passant la colonne que tu veux trier et le sens comme paramètres

ex :
Code :
1
2
3
4
 
Private Sub btnTriCroissant_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTriCroissant.Click
        MonDatagridView.Sort(MonDatagridView.Columns(0),System.ComponentModel.ListSortDirection.Ascending)
    End Sub
Sauf que le contenu des cellules triées est considéré comme du texte et que si tu as 1, 15, 9,20 avant de trier dan stes cellules il va te les trier de la sorte : 1,15,20,9...

Il faudra que tu passe par la personnalisation du tri.

http://msdn.microsoft.com/fr-fr/libr.../ms171608.aspx

A moins que quelqu'un ai une autre solution.
Bonne journée et bonne fin d'année.
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2012, 15h51   #3
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Merci pour ta réponse

Je vais essayer de passer par des buttons donc ma colonne est en ShortMode = Programmatic

Voici le code pour mes boutons :
Code :
1
2
3
4
5
6
7
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Ascending)
    End Sub
 
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Descending)
    End Sub
Et effectivement il trie d'abord la 1er chiffre

Exemple :
1
2
3
4
10
15
25
30

donne en ordre croissant :

1
10
15
2
25
3
30
4 etc.....

Je vais essayer de cogiter sur ton lien pour la personnalisation du tri pour obtenir le bon ordre
Si une personne a une autre solution je suis tout à fait preneur
Merci
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 16h31   #4
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 228
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 228
Points : 558
Points : 558
Salut,

Perso si je devais le faire (ce qui devrais pas tarder à arriver) je pense que j'utiliser l'abonnement à l'évènement SortCompare et j'essayerais de caster le contenu de la cellule en Integer puis je les compare.

Je n'ai pas écrit de code pour le faire mais ça me semble être le plus simple.
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 17h06   #5
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Je vais essayer de déchiffrer ce que tu m'a dis
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 19h34   #6
mdevaux62
Membre actif
 
Michel Devaux
Inscription : janvier 2010
Messages : 102
Détails du profil
Informations personnelles :
Nom : Michel Devaux

Informations forums :
Inscription : janvier 2010
Messages : 102
Points : 181
Points : 181
Bon à la louche j'ai fait ça rapidos :
1) On customise l'évènement _SortCompare. Désormais le tri se fait en fonction des valeurs décimales du contenu des cellules.
On peut vérifier que l'ordre numérique est bien respecté en cliquant sur le libellé des colonnes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Private Sub DataGridView1_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare
        'Récupérer le composant
        Dim grid As DataGridView = DirectCast(sender, DataGridView)
        'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
        Dim colonneQuantite As String = "ColonneQuantite"
        Dim colonnePrixUnit As String = "ColonnePrixUnit"
        Dim colonneTotal As String = "ColonneTotal"
        'Traitement en fonction de la colonne où se situe la cellule en cours d'édition 
        Select Case e.Column.Name
            Case colonnePrixUnit, colonneQuantite, colonneTotal
                e.SortResult = System.Decimal.Compare(e.CellValue1, e.CellValue2)
                e.Handled = True
        End Select
    End Sub
2) On affecte à un ou plusieurs boutons le rôle de lancer l'évènement (pas sûr que ces boutons soient très utiles mais bon...).
A titre d'exemple, j'ai réalisé un bouton qui lance un tri croissant dans la colonne portant le nom "ColonnePrixUnit".

Code :
1
2
3
4
5
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        With DataGridView1
            DataGridView1.Sort(.Columns("ColonnePrixUnit"), System.ComponentModel.ListSortDirection.Ascending)
        End With
    End Sub
mdevaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2012, 20h32   #7
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Merci beaucoup mdevaux62 pour tes réponses trés complètes. Je suis super content car les débuts sont dures pour la programmation d'un datagridview

J'ai donc adapter ton exemple de trie dans mes différentes colonnes mais j'obtiens le même résultat que précedement c'est-à-dire :

1
2
3
4
9
10
11

en ordre décroissant j'obtiens :

9
4
3
2
11
10
1

En fait la raison d'avoir un tri qui fonctionne par numéro est que j'aimerai placer mes articles pour les regrouper dans des familles.

Exemple: admettons que j'ai plusieurs légume dans ma colonne "Num. article" avec le n°20, si je rajoute un article a la fin de mon DGV et que je le met en N°20 dans la colonne "Num. article" et bien il se placerai a la suite des autres articles légumes.

Pour le moment c'est la seul solution que j'ai trouver pour déplacer une ligne à l'endroit ou je souhaite

Si je n'y arrive pas avec les chiffres et bien je passerai par l'alphabet étant donnée que les cellules sont considéré comme du texte
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 20h45   #8
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 228
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 228
Points : 558
Points : 558
Salut,

Après avoir testé longuement de sortir quelque chose, j'ai finis par trouver la solution toute simple donnée par emmr.rida sur ce site

Code :
1
2
3
4
5
6
7
8
9
10
11
 
Private Sub TriNumérique(sender As Object, e As DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare
        If e.Column.Index = 0 Then
            If Integer.Parse(e.CellValue1.ToString) > Integer.Parse(e.CellValue2.ToString) Then
                e.SortResult = -1
            Else
                e.SortResult = 1
            End If
            e.Handled = True
        End If
End Sub
En même temps la solution de mdevaux62 est encore mieux car elle te permet de faire le même tri sur plusieurs colones

Ps: Evites les boutons ça sature l'interface XD

Merci à lui pour cette aide
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2012, 21h28   #9
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Merci pour ta rép Rainui, mais aprés pas mal d'essai cela ne change rien de mon côté

j'ai passé ma colonne en shortmode = Automatic puis dans mon évenement ShortCompare j'y ai mi ceci :


Code :
1
2
3
4
5
6
7
8
If e.Column.Index = 0 Then
            If Integer.Parse(e.CellValue1.ToString) > Integer.Parse(e.CellValue2.ToString) Then
                e.SortResult = -1
            Else
                e.SortResult = 1
            End If
            e.Handled = True
        End If
Résultat du tri toujours pareil
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 22h05   #10
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 228
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 228
Points : 558
Points : 558
Salut,

Tu as bien mis ce code dans une Sub qui a les bons arguments et qui est bien liée à l'évènement DataGridView.SortCompare?

Le paramètre e est bien du type DataGridViewSortCompareEventArgs?
Tu as bien Handles DataGridView1.SortCompare sur la definition de ta Sub?

Le code étant simple, je ne vois vraiment pas pourquoi ça fonctionnerait chez moi et pas chez toi
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2012, 23h57   #11
chrismonoye
Membre émérite
 
Inscription : octobre 2006
Messages : 534
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 534
Points : 804
Points : 804
Bonsoir,
à noter que l'event SortCompare est inopérant si le DGV est "bindé" à une source de données.
Citation:
Cet événement se produit uniquement lorsque la propriété DataSource n'est pas définie...
chrismonoye est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 29/12/2012, 00h09   #12
mdevaux62
Membre actif
 
Michel Devaux
Inscription : janvier 2010
Messages : 102
Détails du profil
Informations personnelles :
Nom : Michel Devaux

Informations forums :
Inscription : janvier 2010
Messages : 102
Points : 181
Points : 181
Citation:
Envoyé par chrismonoye Voir le message
Bonsoir,
à noter que l'event SortCompare est inopérant si le DGV est "bindé" à une source de données.
Arf! Pas de pot !
Reste la solution (lourdingue, mais peut-être temporaire, en attendant mieux) de tout traiter à l'arrache via une double boucle et un tri à bulle.
mdevaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2012, 11h14   #13
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Merci beaucoup pour vos réponses

Bon et bien je vais rester sur du format texte car ce n'est malheureusement pas de mon niveau
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 13h47   #14
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 228
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 228
Points : 558
Points : 558
Salut,

Bien vu Chrismonoye.


Jeremyvb11, il te reste la solution d'intercepter le l'évènement Click sur la colonne, si c'est une de tes colonnes de type numérique, tu changes le datasource de ton datagrigview en triant ta DataTable ou ton DataAdapter suivant tes conditions.

Au final c'est tout aussi simple xD
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 16h40   #15
Graffito
Expert Confirmé Sénior
 
Avatar de Graffito
 
Inscription : janvier 2006
Messages : 5 390
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 5 390
Points : 6 036
Points : 6 036
Pour un dataSource bindé, la seule solution que j'ai trouvée et implémentée pour résoudre ce problème sans changer le DataSource lors du click consiste :
  • à créer une colonne invisible qui permette un tri correct (par exemple en paddant à gauche le nombre),
  • et en un traitement acrobatique du click sur l'en-tête de colonne pour que le tri porte non pas sur la colonne cliquée mais sur la colonne invisible.
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
Graffito est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h36.


 
 
 
 
Partenaires

Hébergement Web