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.