Ordinamento delle righe in una tabella di dati


146

Abbiamo due colonne in una DataTable, in questo modo:

COL1   COL2
Abc    5
Def    8
Ghi    3

Stiamo cercando di ordinare questo in datatablebase COL2all'ordine decrescente.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Abbiamo provato questo:

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

ma, senza usare a DataView, vogliamo ordinare lo DataTablestesso, non il DataView.

Risposte:


355

Temo che non sia possibile eseguire facilmente una sorta di DataTable sul posto come sembra che tu voglia fare.

Quello che puoi fare è creare una nuova DataTable da un DataView che crei dalla tua DataTable originale. Applicare qualsiasi tipo e / o filtro desiderato su DataView e quindi creare una nuova DataTable da DataView utilizzando il metodo DataView.ToTable :

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

voglio il valore crescente in termini di valore del prezzo che è decimale. come farlo?
Ranjith Kumar Nagiri,

Questo approccio sembra a posto. Ma non esiste un modo diretto per farlo? Perché non hanno un DataTable.sort ("by")?
Steam

28
Grazie. Vale la pena notare che "occr desc" qui, "occr" è il nome della colonna, "desc" significa "decrescente".
user1032613

22
Questo ha funzionato per me dataTable.DefaultView.Sort = "Col1, Col2, Col3". Poco codice pulito.
Sai,

7
Proprio come @Sai, è possibile modificare direttamente DataTable.DefaultView.Sort. Non è necessario "dividere" la vista e ricreare una tabella.
Jonny,

40

Questo ti aiuterà ...

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

Grandi menti pensano allo stesso modo. Stavo per pubblicare la stessa soluzione dopo aver letto @ JayR's.
Ha disegnato Chapin il

per Column_name perché ero confuso da ciò che era occr nella soluzione di Jay Riggs :)
Thameem

Soluzione meravigliosa e facile :)
M. Fawad Surosh,

25

Il suo uso semplice. Selezionare la funzione.

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

Ed è fatto ...... Happy Coding


Si noti che se, come OP, si è interessati solo sotto l'aspetto di ordinamento di questo e non si desidera filtrare i risultati, è possibile specificare in questo modo: Select("", "CompanyName ASC").
Tawab Wakil,

20

Forse i seguenti possono aiutare:

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

Qui puoi usare anche altre query sull'espressione Lambda.


14

Hai provato a utilizzare il Select(filterExpression, sortOrder)metodo su DataTable? Vedi qui per un esempio. Nota che questo metodo non ordinerà la tabella di dati in atto, se è quello che stai cercando, ma restituirà una matrice ordinata di righe senza usare una vista dati.


13

Oppure, se puoi usare a DataGridView, puoi semplicemente chiamare 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);
        }
    }
}

Che ti darebbe il risultato desiderato:

Vista del debugger


@vidyasagar Nessun problema. Inoltre, per riferimento futuro, se una risposta è preziosa, dovresti votarla (esempio, la mia?). E se una risposta è "LA" risposta, dovresti contrassegnarla come risposta (esempio, quella di Jay).
Gustavo Mori,

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

Vidya vuole ordinare il suo tavolo per occr in ordine decrescente. Che fa il semplice codice sopra. Fa esattamente ciò che ha mostrato Jay Riggs (risposta accettata), tranne per il fatto che è fatto in una riga di codice.
Ivg,

2
Il suggerimento era di migliorare il post; in futuro inserire tali informazioni sul codice nella risposta. Perché migliora la possibilità che qualcuno voti il ​​post o addirittura lo selezioni come risposta.
ΩmegaMan,

5

Esistono 2 modi per ordinare i dati

1) ordinare solo i dati e riempire in griglia:

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) ordina la vista predefinita che è simile all'ordinamento con l'intestazione della colonna della griglia:

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

1
Grazie per la risposta. La tua strada n. 1 mi ha aiutato nel mio caso: ho definito un IComparer molto speciale, quindi per usarlo ho fatto qualcosa del genere:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei,

4

Si scopre che esiste un caso speciale in cui ciò può essere ottenuto. Il trucco è quando si costruisce la DataTable, raccogliere tutte le righe in un elenco, ordinarle, quindi aggiungerle. Questo caso è appena arrivato qui.


3

// Spero che questo ti aiuti ..

        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

utilizzare tableObject.Select(queryExpression, sortOrderExpression)per selezionare i dati in modo ordinato

Esempio completo

Esempio di lavoro completo - può essere testato in un'applicazione 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();
            }
        }
    }

Produzione

produzione


0

prova questo:

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) È necessario creare una nuova tabella DataTable sortedDT = new DataTable(). 2) È necessario utilizzare ImportRow(non è possibile aggiungere una riga da una tabella diversa)
marbel82,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.