Classificando linhas em uma tabela de dados

Nós temos duas colunas em um DataTable , assim:

 COL1 COL2 Abc 5 Def 8 Ghi 3 

Estamos tentando classificar essa datatable base no COL2 em ordem decrescente.

 COL1 COL2 ghi 8 abc 4 def 3 jkl 1 

Nós tentamos isso:

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

mas, sem usar um DataView , queremos classificar o DataTable si, não o DataView .

Eu tenho medo que você não possa facilmente fazer um tipo de DataTable no local como parece que você quer fazer.

O que você pode fazer é criar uma nova DataTable a partir de um DataView criado a partir de sua DataTable original. Aplique os tipos e / ou filtros desejados no DataView e, em seguida, crie uma nova DataTable a partir do DataView usando o método DataView.ToTable :

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

Talvez o seguinte possa ajudar:

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

Aqui, você pode usar outras consultas de expressão do Lambda também.

Sua function de uso simples .Selecione.

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

E está feito …… Codificação Feliz

Ou, se você pode usar um DataGridView , você poderia apenas chamar 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); } } } 

Que lhe daria o resultado desejado:

Vista do depurador

Você tentou usar o método Select(filterExpression, sortOrder) no DataTable? Veja aqui um exemplo. Observe que esse método não classificará a tabela de dados no lugar, se é isso que você está procurando, mas retornará uma matriz classificada de linhas sem usar uma exibição de dados.

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

Isso vai te ajudar …

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

Acontece que há um caso especial em que isso pode ser alcançado. O truque é construir a DataTable, coletar todas as linhas em uma lista, classificá-las e adicioná-las. Este caso acabou de chegar aqui.

// Espero que isso ajude você ..

  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; 

Existe 2 maneira de ordenar dados

1) classificando apenas dados e preenchendo em grade:

 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) ordenar a visualização padrão que é como ordenar com o header da coluna de grade:

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

TL; DR

use tableObject.Select(queryExpression, sortOrderExpression) para selecionar dados de maneira ordenada

Exemplo completo

Exemplo de trabalho completo – pode ser testado em um aplicativo de 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(); } } } 

Saída

saída

tente isto:

 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;