8
votes

WinForm DataGridView Tri de colonne numérique

J'utilise juste un simple DataGridView pour contenir un tas de données (drôles qui).

J'ai des décimales dans une colonne particulière. Mais quand il s'agit de commander par cette colonne décimale, cela l'ordonne de manière incorrecte. Par exemple:

La commande de départ pourrait être:

  • 0.56
  • 3.45
  • 500.89
  • 20078.90
  • 1.56
  • 100.29
  • 2.39

    L'ordre de fin serait:

    • 0.56
    • 100.29
    • 1.56
    • 20078.90
    • 2.39
    • 3.45
    • 500.89

      Comme vous pouvez le constater, il commande à partir du premier numéro. Puis ordonne-la de cette façon.

      Je pensais peut-être que je pourrais poser la colonne sur un autre "colonique" et que cela peut le faire automatiquement. Mais il n'y a pas de types de colonnes "numériques" ou "décimales".

      J'étais sur MSDN sur la question de la question et je pourrais trouver la méthode "Tri" que je peux utiliser sur la DataGridView. Mais l'explication était un peu sur ma tête et les exemples n'ont pas utilisé de chiffres, seulement du texte, donc je ne pouvais pas voir comment je devais changer les choses.

      Toute aide serait très appréciée.


0 commentaires

6 Réponses :


0
votes

Il le trie par caractère. Vous devez faire flotter le type de colonne afin qu'il sache quel opérateur de comparaison à appliquer.

(vous devez faire le type de colonne dans votre jeu de données, je crois que cela fonctionnera.)


3 commentaires

Yikes! Comment obtenez-vous les données dans la grille?


Eh bien ... j'ai une liste d'une structure personnalisée. Cela comporte environ 5 éléments de chaîne contenus à cet égard. Par conséquent, je peux simplement utiliser une forloop, itération dans la liste et les ajouter un par un dans le DataGrid. Le faire via des squelettes et il n'est pas nécessaire de «tenir» les données une fois dans la grille. Il n'y a pas de manipulation de données (à l'exception de la commande: p), en utilisant simplement le DataGrid à des fins de visualisation.


Ah, je vois. Si vous définissez un itérateur et des propriétés, vous pouvez simplement lier la liste à la grille. Il s'appelle un dataObject (pour la recherche Google).



8
votes

Vous pouvez résoudre ce problème en ajoutant un gestionnaire pour l'événement SortCompare sur le fichier DataGridView avec le code suivant:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Index == 0)
    {
        if (double.Parse(e.CellValue1.ToString()) > double.Parse(e.CellValue2.ToString()))
        {
            e.SortResult = 1;
        }
        else if (double.Parse(e.CellValue1.ToString()) < double.Parse(e.CellValue2.ToString()))
        {
            e.SortResult = -1;
        }             
        else
        {
            e.SortResult = 0;
        }
        e.Handled = true;
   }
}


1 commentaires

Je me suis battu avec cela, votre code fonctionne pendant que les autres que j'ai trouvés non. Merci.



0
votes

Votre problème est le datagridview trie par chaîne. Essayez de caster la chaîne à float lorsque vous copiez cette cellule dans le fichier datagramrid .


0 commentaires

6
votes

J'ai eu le même problème. J'ai essayé d'utiliser le gestionnaire d'événements comme le mentionné David Hall. J'ai utilisé la propriété ValueType lors de la définition du dataGridView. Il trie maintenant aussi doubles, aucun code de gestionnaire d'événements personnalisé requis

dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;


2 commentaires

Très bonne suggestion, si cela fonctionnerait. Cependant, pour une raison quelconque, pour moi cela ne fonctionne pas. Je l'ai vérifié dans le débogueur et l'appréciage est en effet donné comme «double», mais cela ne trie pas en conséquence.


@Yellow Vous pouvez vouloir vérifier si vous faites typeof (double) par opposition à typeof (double) . L'une est une classe et l'autre est un type de variable. J'avais des problèmes similaires lors de l'utilisation de la classe def double aussi.



1
votes

Les types numériques ont une fonction comparète intégrée, qui peut être utilisée comme sortresult de l'événement SortCompare. XXX

Ceci est bien sûr supposant que vous connaissez le type qui a été mis dans la DataGridView commencer par.


0 commentaires

1
votes

Votre type de colonne de base de données doit être intégré ou double ou float, pas varchar ou quelque chose .... Vous devez donc modifier votre type de valeur dans la base de données ... Vous n'avez pas besoin d'écrire un code ni quelque chose qu'il trier directement lorsque vous cliquez sur l'en-tête de la colonne ...


1 commentaires

De plus, vous pouvez modifier votre requête pour lancer le résultat comme INT, Double ou Float. Vous n'avez pas besoin de changer le type de base de données.