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.

vidya sagar
sumber

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();
Jay Riggs
sumber
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();
Ankita_systematix
sumber
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

Abdul
sumber
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.

Wisnu
sumber
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.

Brian Rogers
sumber
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

Gustavo Mori
sumber
@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";
ivg
sumber
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;
Zolfaghari
sumber
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.

Joshua
sumber
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;
Kumod Singh
sumber
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

Zameer
sumber
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;
Rand Shaban
sumber
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