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


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

Великие умы думают одинаково. Я собирался опубликовать то же решение после прочтения @ 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;

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.