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

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

COL1   COL2
Abc    5
Def    8
Ghi    3

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

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

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

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

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

12 ответов


боюсь, вы не можете легко сделать на месте своего рода DataTable, как это звучит, как вы хотите сделать.

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

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

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

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

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


Простое Использование .Выбранная функция.

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

и готово......Счастливое Кодирование


или, если вы можете использовать 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


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


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

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

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

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


//надеюсь, это поможет вам..

        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;

существует 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;

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

выход

output


попробуйте это:

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;