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.

vidya sagar
la source

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();
Jay Riggs
la source
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();
Ankita_systematix
la source
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

Abdul
la source
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.

Vishnu
la source
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.

Brian Rogers
la source
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

Gustavo Mori
la source
@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";
ivg
la source
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;
Zolfaghari
la source
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.

Joshua
la source
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;
Kumod Singh
la source
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

Zameer
la source
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;
Rand Shaban
la source
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