J'utilise juste un simple DataGridView pour contenir un tas de données (drôles qui). p>
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: p>
La commande de départ pourrait être: p>
L'ordre de fin serait: p>
Comme vous pouvez le constater, il commande à partir du premier numéro. Puis ordonne-la de cette façon. p>
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". p>
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. p>
Toute aide serait très appréciée. p>
6 Réponses :
Il le trie par caractère. Vous devez faire flotter le type de colonne afin qu'il sache quel opérateur de comparaison à appliquer. P>
(vous devez faire le type de colonne dans votre jeu de données, je crois que cela fonctionnera.) p>
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).
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; } }
Je me suis battu avec cela, votre code fonctionne pendant que les autres que j'ai trouvés non. Merci.
Votre problème est le datagridview code> trie par chaîne. Essayez de caster la chaîne
code> à
float code> lorsque vous copiez cette cellule dans le fichier
datagramrid code>. P>
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;
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) code> par opposition à
typeof (double) code>. 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.
Les types numériques ont une fonction comparète intégrée, qui peut être utilisée comme sortresult de l'événement SortCompare. Ceci est bien sûr supposant que vous connaissez le type qui a été mis dans la DataGridView commencer par. p> p>
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 ... P>
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.