168 votes

Trier les lignes d'un tableau de données

Nous avons deux colonnes dans un DataTable comme suit :

COL1   COL2
Abc    5
Def    8
Ghi    3

Nous essayons de régler ce problème datatable sur la base de COL2 par ordre décroissant.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Nous avons essayé ceci :

ft.DefaultView.Sort = "COL2 desc";
ft = ft.DefaultView.ToTable(true);

mais, sans utiliser de DataView , nous voulons trier les DataTable elle-même, et non la DataView .

382voto

Jay Riggs Points 30783

Je crains que vous ne puissiez pas facilement effectuer un tri sur place d'un DataTable comme vous semblez vouloir le faire.

Ce que vous pouvez faire, c'est créer une nouvelle table de données à partir d'une fenêtre de données que vous créez à partir de votre table de données d'origine. Appliquez les tris et/ou les filtres que vous souhaitez sur le DataView, puis créez un nouveau DataTable à partir du DataView à l'aide de la fonction DataView.ToTable méthode :

   DataView dv = ft.DefaultView;
   dv.Sort = "occr desc";
   DataTable sortedDT = dv.ToTable();

0 votes

Je veux que la valeur soit ascendante en fonction de la valeur du prix qui est décimale. comment faire ?

0 votes

Cette approche semble satisfaisante. Mais n'y a-t-il pas de moyen direct de le faire ? Pourquoi n'ont-ils pas un DataTable.sort("by") ?

32 votes

Merci. Il est intéressant de noter qu'ici, "occr desc", "occr" est le nom de la colonne, "desc" signifie "descendant".

33voto

Abdul Points 139

Son utilisation est simple : la fonction de sélection.

DataRow[] foundRows=table.Select("Date = '1/31/1979' or OrderID = 2", "CompanyName ASC");
DataTable dt = foundRows.CopyToDataTable();

Et c'est fait......Bon codage

2 votes

Notez que si, comme OP, vous n'êtes intéressé que par l'aspect du tri et que vous ne voulez pas filtrer les résultats, vous pouvez le spécifier comme ceci : Select("", "CompanyName ASC") .

1 votes

C'est une réponse fantastique. Elle permet d'utiliser des chaînes de texte générées dynamiquement pour le filtrage et le tri ! Je suis heureux d'avoir trouvé cette réponse !

14voto

Brian Rogers Points 12160

Avez-vous essayé d'utiliser la fonction Select(filterExpression, sortOrder) sur DataTable ? Voir aquí à titre d'exemple. Notez que cette méthode ne triera pas le tableau de données en place, si c'est ce que vous recherchez, mais qu'elle renverra un tableau de lignes triées sans utiliser de vue de données.

14voto

Gustavo Mori Points 2649

Ou, si vous pouvez utiliser un DataGridView vous pouvez simplement appeler Sort(column, direction) :

namespace Sorter
{
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.dataGridView1.Rows.Add("Abc", 5);
            this.dataGridView1.Rows.Add("Def", 8);
            this.dataGridView1.Rows.Add("Ghi", 3);
            this.dataGridView1.Sort(this.dataGridView1.Columns[1], 
                                    ListSortDirection.Ascending);
        }
    }
}

Ce qui donnerait le résultat escompté :

Debugger view

0 votes

@vidyasagar Pas de problème. De plus, pour référence future, si une réponse est intéressante, vous devriez la voter (exemple, la mienne ?). Et si une réponse est "LA" réponse, vous devez la marquer comme la réponse (par exemple, celle de Jay).

4voto

Joshua Points 13231

Il s'avère qu'il existe un cas particulier où cela est possible. L'astuce consiste, lors de la construction du tableau de données, à rassembler toutes les lignes dans une liste, à les trier, puis à les ajouter. Ce cas s'est présenté ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X