Menyortir baris dalam tabel data


146

Kami memiliki dua kolom dalam DataTable, seperti:

COL1   COL2
Abc    5
Def    8
Ghi    3

Kami mencoba mengurutkan datatableberdasarkan pada COL2urutan menurun.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Kami mencoba ini:

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

tetapi, tanpa menggunakan DataView, kami ingin mengurutkan DataTablesendiri, bukan DataView.

Jawaban:


355

Saya khawatir Anda tidak dapat dengan mudah melakukan semacam DataTable di tempat seperti itu terdengar seperti yang ingin Anda lakukan.

Apa yang dapat Anda lakukan adalah membuat DataTable baru dari DataView yang Anda buat dari DataTable asli Anda. Terapkan jenis dan / atau filter apa pun yang Anda inginkan di DataView dan kemudian buat DataTable baru dari DataView menggunakan metode DataView.ToTable :

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

saya ingin nilai naik dalam hal nilai harga yang desimal. Bagaimana cara melakukannya?
Ranjith Kumar Nagiri

Pendekatan ini tampaknya baik-baik saja. Tetapi apakah tidak ada cara langsung untuk melakukannya? Mengapa mereka tidak memiliki DataTable.sort ("oleh")?
Uap

28
Terima kasih. Perlu dicatat bahwa, "occr desc" di sini, "occr" adalah nama kolom, "desc" berarti "descending".
user1032613

22
Ini bekerja untuk saya dataTable.DefaultView.Sort = "Col1, Col2, Col3". Kode bersih sedikit.
Sai

7
Sama seperti @Sai, Anda dapat memodifikasi DataTable.DefaultView.Sort secara langsung. Tidak perlu "memecah" tampilan dan membuat ulang tabel.
Jonny

40

Ini akan membantu Anda ...

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

Pemikir hebat berfikir yang sama. Saya hendak memposting solusi yang sama setelah membaca @ JayR.
Drew Chapin

untuk Column_name karena saya bingung apa yang terjadi dalam solusi Jay Riggs :)
Thameem

Solusi luar biasa dan mudah :)
M. Fawad Surosh

25

Ini Penggunaan Sederhana. Pilih fungsi.

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

Dan itu selesai ...... Selamat Coding


Perhatikan bahwa jika, seperti OP, Anda hanya tertarik pada aspek menyortir ini dan tidak ingin menyaring hasil, Anda dapat menentukan seperti ini: Select("", "CompanyName ASC").
Tawab Wakil

20

Mungkin yang berikut dapat membantu:

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

Di sini, Anda juga dapat menggunakan kueri ekspresi Lambda lainnya.


14

Apakah Anda mencoba menggunakan Select(filterExpression, sortOrder)metode pada DataTable? Lihat di sini untuk contoh. Catatan metode ini tidak akan mengurutkan tabel data di tempat, jika itu yang Anda cari, tetapi akan mengembalikan array baris yang diurutkan tanpa menggunakan tampilan data.


13

Atau, jika Anda dapat menggunakan DataGridView, Anda bisa menghubungi 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);
        }
    }
}

Yang akan memberi Anda hasil yang diinginkan:

Tampilan debugger


@vidyasagar Tidak masalah. Juga, untuk referensi di masa mendatang, jika jawaban berharga, Anda harus memilihnya (misalnya, milik saya?). Dan jika jawaban adalah jawaban "THE", Anda harus menandainya sebagai jawaban (misalnya, jawaban Jay).
Gustavo Mori

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

Vidya ingin menyortir mejanya berdasarkan urutan dalam urutan desc. Yang dilakukan oleh kode sederhana di atas. Ia melakukan persis seperti yang ditunjukkan Jay Riggs (jawaban yang diterima) kecuali ini dilakukan dalam satu baris kode.
ivg

2
Sarannya adalah memperbaiki pos; di masa depan informasi tentang kode itu menjadi respons. Untuk itu, ada peluang seseorang untuk memperbaiki pos atau bahkan memilihnya sebagai jawabannya.
Ī©megaMan

5

Ada 2 cara untuk mengurutkan data

1) menyortir data saja dan mengisi ke dalam kisi:

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) mengurutkan tampilan default yang seperti mengurutkan dengan tajuk kolom kotak:

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

1
Terima kasih atas jawabannya. Cara Anda # 1 membantu dalam kasus saya: Saya mendefinisikan IComparer yang sangat spesial, jadi untuk menggunakannya saya melakukan sesuatu seperti ini:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

Ternyata ada kasus khusus di mana ini bisa dicapai. Caranya adalah ketika membangun DataTable, kumpulkan semua baris dalam daftar, urutkan, lalu tambahkan. Kasus ini baru saja muncul di sini.


3

// Semoga Ini akan membantumu ..

        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

gunakan tableObject.Select(queryExpression, sortOrderExpression)untuk memilih data dengan cara diurutkan

Contoh lengkap

Contoh kerja lengkap - dapat diuji dalam aplikasi konsol :

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

Keluaran

keluaran


0

coba ini:

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) Anda harus membuat tabel baru DataTable sortedDT = new DataTable(). 2) Anda harus menggunakan ImportRow(Anda tidak dapat menambahkan baris dari tabel yang berbeda)
marbel82
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.