Ordinamento di righe in una tabella di dati

Abbiamo due colonne in un DataTable , in questo modo:

 COL1 COL2 Abc 5 Def 8 Ghi 3 

Stiamo cercando di ordinare questo datatable basato su COL2 in ordine decrescente.

 COL1 COL2 ghi 8 abc 4 def 3 jkl 1 

Abbiamo provato questo:

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

ma, senza utilizzare un DataView , vogliamo ordinare DataTable stesso, non DataView .

Temo che non puoi facilmente creare una sorta di DataTable sul posto come sembra che tu voglia fare.

Quello che puoi fare è creare un nuovo DataTable da un DataView che crei dal tuo DataTable originale. Applicare qualsiasi tipo e / o filtro desiderato sul DataView e quindi creare un nuovo DataTable da DataView utilizzando il metodo DataView.ToTable :

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

Forse il seguente può aiutare:

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

Qui puoi usare anche altre espressioni di espressione Lambda.

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

Oppure, se puoi usare un 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); } } } 

Quale ti darebbe il risultato desiderato:

Vista del debugger

Hai provato a usare il metodo Select(filterExpression, sortOrder) su DataTable? Vedi qui per un esempio. Si noti che questo metodo non ordinerà la tabella di dati sul posto, se questo è ciò che si sta cercando, ma restituirà una matrice ordinata di righe senza utilizzare una visualizzazione dati.

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

Questo ti aiuterà …

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

Si scopre che c’è un caso speciale in cui questo può essere raggiunto. Il trucco è quando si costruisce il DataTable, raccogliere tutte le righe in un elenco, ordinarle e aggiungerle. Questo caso è appena arrivato qui.

// Spero che questo ti possa aiutare ..

  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; 

C’è un modo per ordinare i dati

1) ordinare solo i dati e inserirli nella 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 è come di ordinata 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; 

TL; DR

usa 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

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;