Veri tablosundaki satırları sıralama


152

A'da şu şekilde iki sütunumuz var DataTable:

COL1   COL2
Abc    5
Def    8
Ghi    3

Bunu azalan sıraya datatablegöre sıralamaya çalışıyoruz COL2.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Bunu denedik:

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

ancak, a kullanmadan DataView, DataTablekendisini sıralamak istiyoruz DataView,.

Yanıtlar:


362

Korkarım ki, yapmak istediğiniz gibi bir DataTable'ı yerinde kolayca yapamazsınız.

Yapabileceğiniz şey, orijinal DataTable'ınızdan oluşturduğunuz bir DataView'dan yeni bir DataTable oluşturmaktır. DataView üzerinde istediğiniz türleri ve / veya filtreleri uygulayın ve ardından DataView.ToTable yöntemini kullanarak DataView'dan yeni bir DataTable oluşturun :

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

Ondalık olan fiyat değeri açısından değerin yükselmesini istiyorum. nasıl yapılır?
— Ranjith Kumar Nagiri

Bu yaklaşım iyi görünüyor. Ama bunu yapmanın doğrudan bir yolu yok mu? Neden DataTable.sort ("by") yok?
— Steam

30
Teşekkürler. Burada "occr desc", "occr" sütun adı, "desc", "azalan" anlamına gelir.
— user1032613

24
Bu benim için çalıştı dataTable.DefaultView.Sort = "Col1, Col2, Col3". Küçük temiz kod.
— Sai

7
Aynı @Sai gibi, DataTable.DefaultView.Sort'u doğrudan değiştirebilirsiniz. Görünümü "bölmeye" ve bir tabloyu yeniden oluşturmaya gerek yok.
— Jonny

44

Bu sana yardım edecek...

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

Büyük beyinler aynı düşünür. @ JayR'i okuduktan sonra aynı çözümü göndermek üzereydim.
— Drew Chapin

Column_name için çünkü Jay Riggs'in çözümünde neler olduğu konusunda kafam karışmıştı :)
— Thameem

Harika ve kolay çözüm :)
— M.Fawad Surosh

26

Basit Kullanımı .Seç işlevi.

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

Ve bitti ...... Mutlu Kodlama


OP gibi, yalnızca bu sıralama yönü ilgilenen ve sonuçları filtrelemek istemiyorum edilir, eğer bunu şöyle belirtebilirsiniz Not: Select("", "CompanyName ASC").
— Tawab Wakil

21

Belki aşağıdakiler yardımcı olabilir:

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

Burada diğer Lambda ifade sorgularını da kullanabilirsiniz.


14

Kullandığınız denedin mi Select(filterExpression, sortOrder)DataTable yöntemi? Örnek için buraya bakın . Bu yöntemin, aradığınız buysa, veri tablosunu yerinde sıralamayacağını, ancak bir veri görünümü kullanmadan sıralı bir satır dizisi döndüreceğini unutmayın.


13

Veya a kullanabiliyorsanız DataGridView, şu numarayı arayabilirsiniz 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);
        }
    }
}

Bu size istenen sonucu verir:

Hata ayıklayıcı görünümü


@vidyasagar Sorun değil. Ayrıca, ileride başvurmak için, bir cevap değerliyse, ona oy vermelisiniz (örneğin, benimki mi?). Ve bir cevap "THE" cevabıysa, cevap olarak işaretlemelisiniz (örneğin, Jay'in).
— Gustavo Mori

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

Vidya, masasını azalan sıraya göre sıralamak istiyor. Yukarıdaki basit kodun yaptığı. Jay Riggs'in (kabul edilen cevap) gösterdiği şeyi yapar, ancak bu tek satırlık bir kodda yapılır.
— ivg

3
Öneri, gönderiyi daha iyi hale getirmekti; gelecekte kodla ilgili bilgiyi yanıta yerleştirin. Çünkü birisinin gönderiye olumlu oy verme ve hatta onu cevap olarak seçme şansı daha iyidir.
— ΩmegaMan

5

Verileri sıralamak için 2 yol var

1) sadece verileri sıralamak ve ızgaraya doldurmak:

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) ızgara sütun başlığıyla sıralamak gibi varsayılan görünümü sıralayın:

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

1
Cevap için teşekkürler. Sizin yolunuz 1 numaralı durumumda yardımcı oldu: Çok özel bir IComparer tanımladım, bu yüzden kullanmak için şöyle bir şey yaptım:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
— Aleksei

4

Bunun başarılabileceği özel bir durum olduğu ortaya çıktı. İşin püf noktası, DataTable'ı oluştururken, bir listedeki tüm satırları toplayın, sıralayın ve ardından ekleyin. Bu dava az önce buraya geldi.


3

// Umarım bu size yardımcı olur ..

        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;

2

TL; DR

tableObject.Select(queryExpression, sortOrderExpression)verileri sıralı bir şekilde seçmek için kullanın

Tam örnek

Eksiksiz çalışma örneği - bir konsol uygulamasında test edilebilir :

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

Çıktı

çıktı


0

bunu dene:

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) Yeni tablo oluşturmalısınız DataTable sortedDT = new DataTable(). 2) Kullanmanız gerekiyor ImportRow(farklı tablodan satır ekleyemezsiniz)
— marbel82
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.