Ordenar filas en una tabla de datos


146

Tenemos dos columnas en a DataTable, así:

COL1   COL2
Abc    5
Def    8
Ghi    3

Estamos tratando de resolver esto datatablebasado en COL2en orden decreciente.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Intentamos esto:

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

pero, sin usar a DataView, queremos ordenar el DataTablepropio, no el DataView.

Respuestas:


355

Me temo que no puede hacer fácilmente un DataTable in situ como parece que quiere hacer.

Lo que puede hacer es crear una nueva DataTable a partir de un DataView que cree a partir de su DataTable original. Aplique los tipos y / o filtros que desee en DataView y luego cree una nueva DataTable desde DataView utilizando el método DataView.ToTable :

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

Quiero el valor ascendente en términos de valor de precio que es decimal. ¿cómo hacerlo?
Ranjith Kumar Nagiri

Este enfoque parece estar bien. ¿Pero no hay una forma directa de hacerlo? ¿Por qué no tienen un DataTable.sort ("por")?
Steam

28
Gracias. Vale la pena señalar que "occr desc" aquí, "occr" es el nombre de la columna, "desc" significa "descendente".
user1032613

22
Esto funcionó para mí dataTable.DefaultView.Sort = "Col1, Col2, Col3". Pequeño código limpio.
Sai

77
Al igual que @Sai, puede modificar el DataTable.DefaultView.Sort directamente. No es necesario "romper" la vista y recrear una tabla.
Jonny

40

Esto te ayudara...

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

Grandes mentes piensan igual. Estaba a punto de publicar la misma solución después de leer @ JayR's.
Drew Chapin

para Column_name porque estaba confundido sobre lo que estaba oculto en la solución de Jay Riggs :)
Thameem

Solución maravillosa y fácil :)
M. Fawad Surosh

25

Su uso simple. Seleccione la función.

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

Y está hecho ... Feliz codificación


Tenga en cuenta que si, como OP, sólo está interesado en el aspecto de esta clasificación y no quieren filtrar los resultados, se puede especificar esta manera: Select("", "CompanyName ASC").
Tawab Wakil

20

Quizás lo siguiente pueda ayudar:

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

Aquí, también puede usar otras consultas de expresión Lambda.


14

¿Intentaste usar el Select(filterExpression, sortOrder)método en DataTable? Ver aquí para un ejemplo. Tenga en cuenta que este método no ordenará la tabla de datos en su lugar, si eso es lo que está buscando, pero devolverá una matriz ordenada de filas sin usar una vista de datos.


13

O, si puede usar un DataGridView, simplemente puede llamar 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);
        }
    }
}

Lo que te daría el resultado deseado:

Vista del depurador


@vidyasagar No hay problema. Además, para referencia futura, si una respuesta es valiosa, debe votarla (por ejemplo, ¿la mía?). Y si una respuesta es "LA" respuesta, debe marcarla como la respuesta (por ejemplo, la de Jay).
Gustavo Mori

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

Vidya quiere ordenar su mesa por occr en orden desc. Lo que hace el código simple anterior. Hace exactamente lo que Jay Riggs (respuesta aceptada) mostró, excepto que esto se hace en una línea de código.
ivg

2
La sugerencia era mejorar la publicación; en el futuro coloque esa información sobre el código en la respuesta. Para ello, aumenta la posibilidad de que alguien vote la publicación o incluso la seleccione como respuesta.
ΩmegaMan

5

Hay 2 formas de ordenar datos

1) ordenar solo los datos y rellenarlos en la cuadrícula:

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 la vista predeterminada que es como ordenar con encabezado de columna de cuadrícula:

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

1
Gracias por la respuesta. Su manera # 1 ayudó en mi caso: definí un IComparer muy especial, así que para usarlo hice algo como esto:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

Resulta que hay un caso especial donde esto se puede lograr. El truco consiste en crear la tabla de datos, recopilar todas las filas de una lista, ordenarlas y luego agregarlas. Este caso acaba de llegar aquí.


3

//Espero que esto te ayudará..

        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

utilizar tableObject.Select(queryExpression, sortOrderExpression)para seleccionar datos de manera ordenada

Ejemplo completo

Ejemplo de trabajo completo : se puede probar en una aplicación de consola :

    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();
            }
        }
    }

Salida

salida


0

prueba esto:

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) Debe crear una nueva tabla DataTable sortedDT = new DataTable(). 2) ImportRow
Debe
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.