Сортування рядків у таблиці даних


146

У нас є два стовпці в 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);

але, не використовуючи a DataView, ми хочемо сортувати DataTableсебе, а не the DataView.

Відповіді:


355

Боюся, ви не можете легко зробити на місці такий тип DataTable, як це звучить, як ви хочете зробити.

Що ви можете зробити, це створити нову таблицю даних з DataView, яку ви створюєте з оригінальної таблиці даних. Застосовуйте всі види та / або фільтри, які ви хочете, у DataView, а потім створіть нову таблицю даних із DataView за допомогою методу DataView.ToTable :

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

Я хочу, щоб значення зростало з урахуванням вартості ціни, яка є десятковою. як це зробити?
Ранджіт Кумар Нагірі

Цей підхід здається прекрасним. Але чи немає прямого способу це зробити? Чому вони не мають DataTable.sort ("від")?
Steam

28
Дякую. Варто зауважити, що "Окр деск" тут, "Окр" - це назва стовпця, "Дес" означає "низхідний".
user1032613

22
Це працювало для мене dataTable.DefaultView.Sort = "Col1, Col2, Col3". Маленький чистий код.
Сай

7
Як і @Sai, ви можете змінювати DataTable.DefaultView.Sort безпосередньо. Не потрібно «вибивати» погляд і відтворити таблицю.
Джоні

40

Це допоможе вам ...

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

Великі уми мислять однаково. Я збирався опублікувати таке ж рішення, прочитавши @ JayR's.
Дрю Чапін

для Column_name, тому що я збентежився тим, що було в рішенні Джея Ріггса :)
Thameem

Чудове і просте рішення :)
М. Фавад Сурош

25

Його просте використання. Виберіть функцію.

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

І це зроблено ...... Happy Coding


Зверніть увагу , що якщо, як OP, ви зацікавлені тільки в сортувальному аспекті цього і не хочете , щоб фільтрувати результати, ви можете вказати це в такий спосіб : Select("", "CompanyName ASC").
Tawab Wakil

20

Може допомогти наступне:

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

Тут ви можете використовувати й інші запити щодо вираження лямбда.


14

Чи спробували ви використовувати Select(filterExpression, sortOrder)метод на DataTable? Дивіться тут приклад. Зауважте, що цей метод не буде сортувати таблицю даних на місці, якщо це саме те, що ви шукаєте, але він поверне відсортований масив рядків без використання представлення даних.


13

Або, якщо ви можете використовувати a 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);
        }
    }
}

Що дасть бажаний результат:

Перегляд налагоджувача


@vidyasagar Немає проблем. Крім того, для подальшого ознайомлення, якщо відповідь є цінною, ви повинні її проголосувати (наприклад, моя?). І якщо відповідь - це відповідь "THE", ви повинні позначити її як відповідь (наприклад, Jay's).
Густаво Морі

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

Відя хоче сортувати свій стіл за окрром у порядку деc. Що робить простий код вище. Це робить саме те, що показав Джей Ріггс (прийнята відповідь), за винятком того, що це робиться в одному рядку коду.
ivg

2
Пропозиція полягала в тому, щоб покращити посаду; надалі помістіть цю інформацію про код у відповідь. Бо це дає більше шансів, що хтось відправить пост або навіть обрав його як відповідь.
ΩmegaMan

5

Існує 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;

1
Дякую за відповідь. Ваш спосіб №1 допоміг у моєму випадку: я визначив дуже спеціальний IComparer, тому для його використання я зробив щось подібне:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Олексій

4

Виявляється, є окремий випадок, коли цього можна досягти. Хитрість полягає у створенні DataTable, збирайте всі рядки у списку, сортуйте їх, а потім додайте їх. Цей випадок якраз і з’явився тут.


3

// Сподіваюся, що це допоможе тобі ..

        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

використовувати 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();
            }
        }
    }

Вихідні дані

вихід


0

спробуйте це:

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) Ви повинні створити нову таблицю DataTable sortedDT = new DataTable(). 2) Вам потрібно скористатися ImportRow(ви не можете додати рядок з іншої таблиці)
marbel82
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.