Tri des lignes dans une table de données


146

Nous avons deux colonnes dans a DataTable, comme ceci:

COL1   COL2
Abc    5
Def    8
Ghi    3

Nous essayons de régler ce problème datatablesur la base COL2dans l' 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 a DataView, nous voulons trier le DataTablelui - même, pas le DataView.

Réponses:


355

J'ai peur que vous ne puissiez pas facilement créer une sorte de DataTable sur place comme si vous vouliez le faire.

Ce que vous pouvez faire est de créer un nouveau DataTable à partir d'un DataView que vous créez à partir de votre DataTable d'origine. Appliquez les tris et / ou filtres souhaités sur le DataView, puis créez un nouveau DataTable à partir du DataView à l'aide de la méthode DataView.ToTable :

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

Je veux que la valeur augmente en termes de valeur de prix qui est décimale. comment faire?
Ranjith Kumar Nagiri

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

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

22
Cela a fonctionné pour moi dataTable.DefaultView.Sort = "Col1, Col2, Col3". Peu de code propre.
Sai le

7
Tout comme @Sai, vous pouvez modifier directement le DataTable.DefaultView.Sort. Inutile de "casser" la vue et de recréer un tableau.
Jonny

40

Cela vous aidera ...

DataTable dt = new DataTable();         
dt.DefaultView.Sort = "Column_name desc";
dt = dt.DefaultView.ToTable();

Les grands esprits se rencontrent. J'étais sur le point de publier la même solution après avoir lu @ JayR's.
Drew Chapin le

pour Column_name parce que j'étais confus ce qui était occr dans la solution de Jay Riggs :)
Thameem

Solution merveilleuse et facile :)
M. Fawad Surosh

25

Son utilisation simple .Sélectionnez la fonction.

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

Et c'est fait ... Bon codage


Notez que si, comme OP, vous ne souhaitez que l'aspect tri de cela et ne veulent pas filtrer les résultats, vous pouvez spécifier comme ceci: Select("", "CompanyName ASC").
Tawab Wakil

20

Peut-être que ce qui suit peut vous aider:

DataRow[] dataRows = table.Select().OrderBy(u => u["EmailId"]).ToArray();

Ici, vous pouvez également utiliser d'autres requêtes d'expression Lambda.


14

Avez-vous essayé d'utiliser la Select(filterExpression, sortOrder)méthode sur DataTable? Voir ici pour un exemple. Notez que cette méthode ne triera pas la table de données sur place, si c'est ce que vous recherchez, mais elle renverra un tableau trié de lignes sans utiliser une vue de données.


13

Ou, si vous pouvez utiliser a 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 vous donnerait le résultat souhaité:

Vue du débogueur


@vidyasagar Pas de problème. Aussi, pour référence future, si une réponse est valable, vous devriez la voter (par exemple, la mienne?). Et si une réponse est "LA" réponse, vous devez la marquer comme réponse (par exemple, Jay).
Gustavo Mori le

11
 table.DefaultView.Sort = "[occr] DESC";

Vidya veut trier sa table par occr dans l'ordre desc. Ce que fait le simple code ci-dessus. Il fait exactement ce que Jay Riggs (réponse acceptée) a montré, sauf que cela se fait en une seule ligne de code.
ivg

2
La suggestion était d'améliorer le poste; à l'avenir, placez ces informations sur le code dans la réponse. Car cela améliore la chance que quelqu'un vote pour le poste ou même le sélectionne comme réponse.
ΩmegaMan

5

Il existe 2 façons de trier les données

1) trier uniquement les données et les remplir dans la grille:

DataGridView datagridview1 = new DataGridView(); // for show data
DataTable dt1 = new DataTable(); // have data
DataTable dt2 = new DataTable(); // temp data table
DataRow[] dra = dt1.Select("", "ID DESC");
if (dra.Length > 0)
    dt2 = dra.CopyToDataTable();
datagridview1.DataSource = dt2;

2) triez la vue par défaut qui ressemble à un tri avec un en-tête de colonne de grille:

DataGridView datagridview1 = new DataGridView(); // for show data
DataTable dt1 = new DataTable(); // have data
dt1.DefaultView.Sort = "ID DESC";
datagridview1.DataSource = dt1;

1
Merci d'avoir répondu. Votre façon n ° 1 a aidé dans mon cas: j'ai défini un IComparer très spécial, donc pour l'utiliser, j'ai fait quelque chose comme ceci:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

Il s'avère qu'il existe un cas particulier où cela peut être réalisé. L'astuce consiste à créer le DataTable, à collecter toutes les lignes d'une liste, à les trier, puis à les ajouter. Cette affaire vient juste d'arriver ici.


3

//J'espère que ceci vous aidera..

        DataTable table = new DataTable();
        //DataRow[] rowArray = dataTable.Select();
        table = dataTable.Clone();
        for (int i = dataTable.Rows.Count - 1; i >= 0; i--)
        {
            table.ImportRow(dataTable.Rows[i]);
        }
        return table;

1

TL; DR

utiliser tableObject.Select(queryExpression, sortOrderExpression)pour sélectionner les données de manière triée

Exemple complet

Exemple de travail complet - peut être testé dans une application console :

    using System;
    using System.Data;

    namespace A
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataTable table = new DataTable("Orders");
                table.Columns.Add("OrderID", typeof(Int32));
                table.Columns.Add("OrderQuantity", typeof(Int32));
                table.Columns.Add("CompanyName", typeof(string));
                table.Columns.Add("Date", typeof(DateTime));

                DataRow newRow = table.NewRow();
                newRow["OrderID"] = 1;
                newRow["OrderQuantity"] = 3;
                newRow["CompanyName"] = "NewCompanyName";
                newRow["Date"] = "1979, 1, 31";

                // Add the row to the rows collection.
                table.Rows.Add(newRow);

                DataRow newRow2 = table.NewRow();
                newRow2["OrderID"] = 2;
                newRow2["OrderQuantity"] = 2;
                newRow2["CompanyName"] = "NewCompanyName1";
                table.Rows.Add(newRow2);

                DataRow newRow3 = table.NewRow();
                newRow3["OrderID"] = 3;
                newRow3["OrderQuantity"] = 2;
                newRow3["CompanyName"] = "NewCompanyName2";
                table.Rows.Add(newRow3);

                DataRow[] foundRows;

                Console.WriteLine("Original table's CompanyNames");
                Console.WriteLine("************************************");
                foundRows = table.Select();

                // Print column 0 of each returned row.
                for (int i = 0; i < foundRows.Length; i++)
                    Console.WriteLine(foundRows[i][2]);

                // Presuming the DataTable has a column named Date.
                string expression = "Date = '1/31/1979' or OrderID = 2";
                // string expression = "OrderQuantity = 2 and OrderID = 2";

                // Sort descending by column named CompanyName.
                string sortOrder = "CompanyName ASC";

                Console.WriteLine("\nCompanyNames data for Date = '1/31/1979' or OrderID = 2, sorted CompanyName ASC");
                Console.WriteLine("************************************");
                // Use the Select method to find all rows matching the filter.
                foundRows = table.Select(expression, sortOrder);

                // Print column 0 of each returned row.
                for (int i = 0; i < foundRows.Length; i++)
                    Console.WriteLine(foundRows[i][2]);

                Console.ReadKey();
            }
        }
    }

Production

production


0

essaye ça:

DataTable DT = new DataTable();
DataTable sortedDT = DT;
sortedDT.Clear();
foreach (DataRow row in DT.Select("", "DiffTotal desc"))
{
    sortedDT.NewRow();
    sortedDT.Rows.Add(row);
}
DT = sortedDT;

1) Vous devez créer une nouvelle table DataTable sortedDT = new DataTable(). 2) Vous devez utiliser ImportRow(vous ne pouvez pas ajouter de ligne à partir d'une table différente)
marbel82
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.