Sắp xếp các hàng trong bảng dữ liệu


146

Chúng tôi có hai cột trong một DataTable, như vậy:

COL1   COL2
Abc    5
Def    8
Ghi    3

Chúng tôi đang cố gắng sắp xếp thứ này datatabledựa trên COL2thứ tự giảm dần.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Chúng tôi đã thử điều này:

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

nhưng, không sử dụng a DataView, chúng tôi muốn sắp xếp DataTablechính nó, không phải là DataView.

Câu trả lời:


355

Tôi e rằng bạn không thể dễ dàng thực hiện một loại DataTable tại chỗ giống như bạn muốn làm.

Những gì bạn có thể làm là tạo một DataTable mới từ DataView mà bạn tạo từ DataTable ban đầu của mình. Áp dụng bất kỳ loại sắp xếp và / hoặc bộ lọc nào bạn muốn trên DataView và sau đó tạo DataTable mới từ DataView bằng phương thức DataView.ToTable :

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

tôi muốn giá trị tăng dần theo giá trị thập phân. làm thế nào để làm nó?
Ranjith Kumar Nagiri

Cách tiếp cận này có vẻ tốt. Nhưng không có cách làm trực tiếp? Tại sao họ không có DataTable.sort ("by")?
Hấp

28
Cảm ơn. Điều đáng chú ý là, "constr desc" ở đây, "constr" là tên cột, "desc" có nghĩa là "giảm dần".
dùng1032613

22
Điều này làm việc cho tôi dataTable.DefaultView.Sort = "Col1, Col2, Col3". Ít sạch mã.
Sai

7
Giống như @Sai, bạn có thể sửa đổi trực tiếp DataTable.DefaultView.Sort. Không cần phải "thoát ra" chế độ xem và tạo lại bảng.
Jonny

40

Điều này sẽ giúp bạn...

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

Tư tưởng lớn gặp nhau. Tôi đã định đăng cùng một giải pháp sau khi đọc @ JayR's.
vẽ Chapin

đối với Cột_name vì tôi đã nhầm lẫn những gì xảy ra trong giải pháp của Jay Riggs :)
Thameem

Giải pháp tuyệt vời và dễ dàng :)
M. Fawad Surosh

25

Nó sử dụng đơn giản. Chọn chức năng.

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

Và đã xong ...... Mã hóa hạnh phúc


Lưu ý rằng, giống như OP, bạn chỉ quan tâm đến khía cạnh sắp xếp của việc này và không muốn lọc kết quả, bạn có thể chỉ định nó như thế này : Select("", "CompanyName ASC").
Tawab Wakil

20

Có lẽ những điều sau đây có thể giúp:

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

Tại đây, bạn cũng có thể sử dụng các truy vấn biểu thức Lambda khác.


14

Bạn đã thử sử dụng Select(filterExpression, sortOrder)phương thức trên DataTable chưa? Xem ở đây cho một ví dụ. Lưu ý phương pháp này sẽ không sắp xếp bảng dữ liệu tại chỗ, nếu đó là những gì bạn đang tìm kiếm, nhưng nó sẽ trả về một mảng các hàng được sắp xếp mà không cần sử dụng chế độ xem dữ liệu.


13

Hoặc, nếu bạn có thể sử dụng một DataGridView, bạn chỉ có thể gọi 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);
        }
    }
}

Mà sẽ cho bạn kết quả mong muốn:

Chế độ xem trình gỡ lỗi


@vidyasagar Không có vấn đề. Ngoài ra, để tham khảo trong tương lai, nếu một câu trả lời có giá trị, bạn nên bỏ phiếu cho nó (ví dụ: của tôi?). Và nếu câu trả lời là câu trả lời "THE", bạn nên đánh dấu nó là câu trả lời (ví dụ: của Jay).
Gustavo Mori

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

Vidya muốn sắp xếp bảng của mình bằng cách theo thứ tự desc. Mà các mã đơn giản ở trên không. Nó thực hiện chính xác những gì Jay Riggs (câu trả lời được chấp nhận) cho thấy ngoại trừ việc này được thực hiện trong một dòng mã.
ivg

2
Đề nghị là để tốt hơn bài viết; trong tương lai thông tin về mã vào phản hồi. Đối với nó, cơ hội của một người nào đó nâng cao bài đăng hoặc thậm chí chọn nó làm câu trả lời.
ΩmegaMan

5

Có 2 cách để sắp xếp dữ liệu

1) chỉ sắp xếp dữ liệu và điền vào lưới:

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) sắp xếp chế độ xem mặc định giống như sắp xếp với tiêu đề cột lưới:

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

1
Cảm ơn câu trả lời. Cách của bạn # 1 đã giúp ích trong trường hợp của tôi: Tôi đã xác định được một IComparer rất đặc biệt, vì vậy để sử dụng nó, tôi đã làm một cái gì đó như thế này:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

Hóa ra có một trường hợp đặc biệt mà điều này có thể đạt được. Thủ thuật là khi xây dựng DataTable, thu thập tất cả các hàng trong danh sách, sắp xếp chúng, sau đó thêm chúng. Trường hợp này vừa mới lên đây.


3

//Hy vọng điều này sẽ giúp bạn..

        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

sử dụng tableObject.Select(queryExpression, sortOrderExpression)để chọn dữ liệu theo cách sắp xếp

Ví dụ hoàn chỉnh

Hoàn thành ví dụ làm việc - có thể được kiểm tra trong ứng dụng giao diện điều khiển :

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

Đầu ra

đầu ra


0

thử cái này:

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) Bạn phải tạo bảng mới DataTable sortedDT = new DataTable(). 2) Bạn cần sử dụng ImportRow(bạn không thể thêm hàng từ các bảng khác nhau)
marbel82
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.