Tri des lignes dans un tableau de données

Nous avons deux colonnes dans un DataTable , comme ceci:

 COL1 COL2 Abc 5 Def 8 Ghi 3 

Nous essayons de sortinger cette datatable fonction de COL2 en ordre décroissant.

 COL1 COL2 ghi 8 abc 4 def 3 jkl 1 

Nous avons essayé ceci:

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

mais, sans utiliser un DataView , nous voulons sortinger le DataTable lui-même, pas le DataView .

Je crains que vous ne puissiez pas facilement faire une sorte de DataTable sur place comme si vous vouliez le faire.

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

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

Peut-être que ce qui suit peut aider:

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

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

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 …… Heureux codage

Ou, si vous pouvez utiliser un 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

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

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

Cela vous aidera …

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

Il s’avère qu’il existe un cas particulier où cela peut être réalisé. L’astuce consiste à comstackr toutes les lignes d’une liste, à les sortinger puis à les append. Cette affaire est juste venue ici.

//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; 

Il y a 2 manières pour sortinger les données

1) sorting juste les données et remplir la grid:

 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) sortinger la vue par défaut qui ressemble au sorting avec l’en-tête de la colonne de la grid:

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

TL; DR

utiliser tableObject.Select(queryExpression, sortOrderExpression) pour sélectionner les données de manière sortingé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(ssortingng[] args) { DataTable table = new DataTable("Orders"); table.Columns.Add("OrderID", typeof(Int32)); table.Columns.Add("OrderQuantity", typeof(Int32)); table.Columns.Add("CompanyName", typeof(ssortingng)); 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(); } } } 

Sortie

sortie

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;