Сортировка строк в таблице данных

У нас есть два столбца в DataTable, например так:

COL1   COL2
Abc    5
Def    8
Ghi    3

Мы пытаемся отсортировать этот datatable на основе COL2 в порядке убывания.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Мы попробовали это:

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

но, не используя DataView, мы хотим отсортировать сам DataTable, а не DataView.

Ответ 1

Я боюсь, вы не сможете легко сделать вид DataTable на месте, похожий на то, что вы хотите сделать.

Что вы можете сделать, так это создать новый DataTable из DataView, который вы создаете из исходного DataTable. Примените любые виды и/или фильтры, которые вы хотите в DataView, а затем создайте новый DataTable из DataView с помощью метода DataView.ToTable:

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

Ответ 2

Это поможет вам...

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

Ответ 3

Его простое использование. Выберите функцию.

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

И это сделано...... Happy Coding

Ответ 4

Возможно, следующее может помочь:

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

Здесь вы также можете использовать другие запросы выражения Lambda.

Ответ 5

Пробовал ли вы использовать метод Select(filterExpression, sortOrder) в DataTable? См. здесь для примера. Обратите внимание, что этот метод не будет сортировать таблицу данных на месте, если это то, что вы ищете, но оно вернет отсортированный массив строк без использования представления данных.

Ответ 6

Или, если вы можете использовать DataGridView, вы можете просто вызвать 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);
        }
    }
}

Что даст желаемый результат:

Debugger view

Ответ 7

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

Ответ 8

Оказывается, есть специальный случай, когда это может быть достигнуто. Трюк заключается в создании DataTable, сборе всех строк в списке, сортировке их и их добавлении. Этот случай просто появился здесь.

Ответ 9

Существует 2 способа сортировки данных

1) сортировка только данных и заполнение сетки:

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) сортировать представление по умолчанию, подобное сортировке с заголовком столбца таблицы:

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

Ответ 10

//Надежда Это поможет вам.

        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;

Ответ 11

TL; DR

используйте tableObject.Select(queryExpression, sortOrderExpression) для выбора данных отсортированным образом

Полный пример

Завершить рабочий пример - можно протестировать в консольном приложении :

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

Выход

output

Ответ 12

попробуйте следующее:

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;