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.DataSource.Sort avec chiffres et texte


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut DataGridView.DataSource.Sort avec chiffres et texte
    Bonsoir à tous,

    Voilà, pour trier mon Datagridview, j'utilise la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView.DataSource.Sort = "Code ASC"
    Le problème est que le contenu de ma colonne "Code" peut contenir soit des chiffres, soit du texte. La plupart de mes données sont des chiffres.

    De ce fait avec la fonction ci dessus, le tri n'est pas correct ..... Est-il possible de faire en sorte qu'il ne trie que les chiffres et que là ou il y a du texte, il s'en occupe pas pour trier. Mais je dois quand même les voir dans mon datagridview. Ensuite qu'ils soient en haut ou en bas c'est égal.

    Merci beaucoup pour votre future aide

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Rebonjour à tous,

    Je me suis peut-être mal exprimé dans mon premier message....

    Dans une base access, j'ai une colonne Code qui peut contenir des chiffres et/ou des caractères alphabétiques comme :

    4465464
    MUE4545
    2222
    111

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView.DataSource.Sort = "Code ASC"
    n'arrive pas à me classer correctement cette liste par ordre croissant par exemple car il y a des lignes avec des caractères alphabétiques comme MUE4545.

    Existe-il un moyen qu'il classe tout : les chiffres puis les autres qui contiennent du texte ?

    Merci d'avance

  3. #3
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonsoir,

    Il vous suffit d'implémenter votre propre algorithme de tri comme préconiser par MSDN.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Merci pour votre réponse mais j'avoue que j'ai un peu de mal à adapter celà à mon cas .....

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Dites nous ce que vous avez essayé et on essayera de vous aider

  6. #6
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Il n'y a malheureusement aucune bonne solution si le DataGridView est relié à un BindingSource lui même lié à une DataTable .

    Un palliatif consiste à ajouter une colonne "SortedCode" bien triée dans la DataTable avec un contenu déduit de la colonne "Code" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    4465464 -> 000465464
    MUE4545 -> MUE4545
    2222    -> 000002222
    111     -> 000000111
    et on rendra la colonne "SortedCode" du DataGridView invisible.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Il n'y a malheureusement aucune bonne solution si le DataGridView est relié à un BindingSource lui même lié à une DataTable .
    Il est vrais que ceci n'était pas renseigné sur la page MSDN donnée, mais en allant une page plus loin, on peut voir :
    Tri par programme:

    Remarque
    Lorsque le contrôle DataGridView est lié à une source de données externe en définissant la propriété DataSource, la surcharge de méthode Sort(DataGridViewColumn,ListSortDirection) ne fonctionne pas pour les colonnes indépendantes. De plus, lorsque la propriété VirtualMode est true, vous pouvez appeler cette surcharge uniquement pour les colonnes dépendantes. Pour déterminer si une colonne est liée aux données, sélectionnez la valeur de propriété IsDataBound. Le tri de colonnes indépendantes en mode dépendant n'est pas pris en charge.
    et

    Tri personnalisé :

    Remarque
    La surcharge de méthode Sort(IComparer) fonctionne uniquement lorsque le contrôle DataGridView n'est pas lié à une source de données externe et que la valeur de propriété VirtualMode est false. Pour personnaliser le tri pour les colonnes liées à une source de données externe, vous devez utiliser les opérations de tri fournies par la source de données. En mode virtuel, vous devez fournir vos propres opérations de tri pour les colonnes indépendantes.
    Embêtant cela
    Comme d'hab, bien vu Graffito

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Merci pour vos réponses mais c'est normal que je ne comprenne pas tout

    En clair, çà marche pas ..... C'est soit des chiffres, soit des caractères. Il ne sait pas trier en premier les chiffres puis les lettres de l'alphabet
    C'est dommage car si au moins ils me mettaient les chiffres dans l'ordre puis le reste sans le classer, ce serait déjà pas mal.... Mais là lorsque c'est mélangé, il trie bizzare ....

  9. #9
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    il trie bizzare ....
    Non, c'est un simple tri alphabétique où chiffres et caractères spéciaux sont considérés comme des lettres.

    Le tri alphabétique (comme dans un dictionnaire classique, un "Larousse" par exemple) compare 2 mots en comparant d'abord leur premier caractère, puis en cas d'identité le second et ainsi de suite. C'est pourquoi "12345" est plus petit que "87" (du fait de la comparaison du '1' et du '8').
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut Graffito,

    il trie donc ainsi car les cellules de ma colonne contiennent des chiffres et des lettres et je n'ai pas appliqué un format spécifique (nombre, date, etc ...) pour toutes les cellules de ma colonne .....
    Il n'y a donc aucun moyen de faire en sorte qu'il ne trie que les chiffres avec une condition du style if .. isnumeric et que ce qui n'est pas numérique il me le mette à la fin du tableau ?

  11. #11
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Le palliatif que j'ai indiqué précédement peut te donner une solution,
    à savoir créer une colonne "CodeInvisible" dépendant de "Code", mais bien triée (par exemple, en faisant un LeftPad des nombres avec des "0") et en gérant l'event ColumnHeaderMouseClick comme indiqué ci-dessous.
    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
     
    internal SortedList<string,string> CustomSortColumns = new SortedList<string,string>();
    ...
    // Code à exécuter une fois le binding du GridView avec la DataTable effectué
    CustomSortColumns.Add("Code","CodeInvisible") 
    InitCustomSortColumns() ;
    ...
     
    private void InitCustomSortColumns()
        {
          GridView.ColumnHeaderMouseClick -= new DataGridViewCellMouseEventHandler(GridView_ColumnHeaderMouseClick);
          if (CustomSortColumns.Count > 0) GridView.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(GridView_ColumnHeaderMouseClick);
          for (int i=0;i<CustomSortColumns.Count;i++)
          {
            string ColumnName               = CustomSortColumns.Keys  [i] ;
            string HiddenColumnName         = CustomSortColumns.Values[i] ;
            DataGridViewColumn Column       = GridView.Columns[ColumnName      ];
            DataGridViewColumn HiddenColumn = GridView.Columns[HiddenColumnName];
            if (Column != null && HiddenColumn!=null ) 
            {
              if (CustomSortColumns.Count==0) GridView.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(GridView_ColumnHeaderMouseClick);
              if (!CustomSortColumns.ContainsKey(ColumnName)) CustomSortColumns.Add(ColumnName, HiddenColumnName);
              Column.SortMode = DataGridViewColumnSortMode.Programmatic ;
              HiddenColumn.Visible= false ;
            }
          }
        }
     
        private void GridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
     
          if (GridView.Columns[e.ColumnIndex].SortMode != DataGridViewColumnSortMode.NotSortable &&
              CustomSortColumns.ContainsKey(GridView.Columns[e.ColumnIndex].Name))
          {
            int CustomSortIndex=CustomSortColumns.IndexOfKey(GridView.Columns[e.ColumnIndex].Name) ;
            SortOrder TheSortOrder = GridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == SortOrder.Ascending ?
                             SortOrder.Descending : SortOrder.Ascending ;
           // Sort on hiddenColumn (i.e. CustomSortColumns.Values) 
           // instead of Normal column (i.e CustomSortColumns.Keys) 
            GridView.BindingSource.Sort = CustomSortColumns.Values[CustomSortIndex] + (TheSortOrder == SortOrder.Ascending ? " ASC" : " DESC");
            GridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = TheSortOrder ;
          }
        }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut Graffito,

    Je déterre ce sujet car entre temps j'avais formaté une colonne et le tri se faisait correctement.
    Le dernier bout de code que tu m'as suggéré est en C il me semble.
    Mais j'ai à nouveau une nouvelle colonne "généraliste" ou tout peut être inscrit ...
    J'ai du mal à le traduire en Vbnet, peux-tu m'aider ?

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour à tous,

    Voilà comme suggéré, j'ai crée une colonne dans mon Datagridview qui est masqué (Column 40). Cette colonne est au format numérique. Il résulte d'un petit traitement de la Column 38 pour n'avoir que du numérique dans la Column(40)
    Ensuite je gère ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Table1DataGridView_ColumnHeaderMouseDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles Table1DataGridView.ColumnHeaderMouseDoubleClick
    If Table1Datagridview.Columns(e.ColumnsIndex).Name = "Column38"  then      
    With Table1DataGridView
                Table1DataGridView.Sort(.Columns(40), System.ComponentModel.ListSortDirection.Ascending)
            End With
    End if
        End Sub
    Jusque là çà marche. Bon du fait que j'ai mis la Column38 en programmatic, on perd le petit curseur pour indiquer le sens.

    J'aimerais intégrer dans ce code le classement "Descending". En fait je n'arrive pas à écrire la ligne de code qui permet de vérifier dans quelle sens est trié la Column(40) pour inverser tout simplement son classement à chaque fois que l'utilisateur appuie sur la Column 38.

    Merci pour votre future aide

Discussions similaires

  1. Souci avec la propriété DataSource d'une zone de texte
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 22/04/2007, 09h45
  2. [VBA-E] probleme avec chiffre stocké en texte
    Par moimemessssssssss dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/02/2007, 19h47
  3. [XSL] xsl:sort avec parametre et condition
    Par elraton dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/01/2005, 20h59
  4. Contenu DataSource.xml avec base Mysql
    Par PrinceMaster77 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 11/03/2004, 12h59
  5. Dessiner un rectangle avec bords et texte ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 17h17

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