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

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себя, а не DataView.

Видья Сахар
источник

Ответы:

355

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

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

   DataView dv = ft.DefaultView;
   dv.Sort = "occr desc";
   DataTable sortedDT = dv.ToTable();
Джей Риггс
источник
Я хочу, чтобы значение по возрастанию выражалось в десятичном значении. как это сделать?
Ранджит Кумар Нагири
Этот подход кажется хорошим. Но нет ли прямого способа сделать это? Почему у них нет DataTable.sort ("by")?
Steam
28
Спасибо. Стоит отметить, что «occr desc» здесь, «occr» - это имя столбца, «desc» означает «нисходящий».
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();
Ankita_systematix
источник
Великие умы думают одинаково. Я собирался опубликовать то же решение после прочтения @ 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").
Таваб Вакиль
20

Может быть, следующее может помочь:

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

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

Вишну
источник
14

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

Брайан Роджерс
источник
13

Или, если вы можете использовать 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», вы должны пометить его как ответ (например, ответ Джея).
Густаво Мори
11
 table.DefaultView.Sort = "[occr] DESC";
ИДК
источник
Видья хочет отсортировать свой стол по occr в порядке убывания. Что делает простой код выше. Он делает именно то, что показал Джей Риггс (принятый ответ), за исключением того, что это делается в одной строке кода.
IV
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;
Zolfaghari
источник
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();
            }
        }
    }

Вывод

вывод

Zameer
источник
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