การเรียงแถวในตารางข้อมูล


146

เรามีสองคอลัมน์ใน a DataTableดังนี้:

COL1   COL2
Abc    5
Def    8
Ghi    3

เรากำลังพยายามจัดเรียงสิ่งนี้datatableตามCOL2ลำดับที่ลดลง

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

เราลองทำสิ่งนี้:

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

แต่โดยไม่ต้องใช้DataViewเราต้องการที่จะจัดเรียงตัวเองไม่ได้DataTableDataView

คำตอบ:


355

ฉันเกรงว่าคุณจะไม่สามารถทำ DataTable ในตำแหน่งได้อย่างง่ายดายเหมือนที่คุณต้องการ

สิ่งที่คุณสามารถทำได้คือสร้าง DataTable ใหม่จาก DataView ที่คุณสร้างจาก DataTable ดั้งเดิมของคุณ ใช้ทุกประเภทและ / หรือตัวกรองที่คุณต้องการบน DataView แล้วสร้าง DataTable ใหม่จาก DataView โดยใช้วิธีDataView.ToTable :

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

ฉันต้องการค่าจากน้อยไปมากในแง่ของมูลค่าราคาซึ่งเป็นทศนิยม ทำอย่างไร?
Ranjith Kumar Nagiri

วิธีนี้ดูเหมือนดี แต่ไม่มีวิธีโดยตรงในการทำมัน? ทำไมพวกเขาไม่มี DataTable.sort ("โดย")
Steam

28
ขอบคุณ เป็นที่น่าสังเกตว่า "occr desc" ที่นี่ "occr" เป็นชื่อคอลัมน์ "desc" หมายถึง "มากไปหาน้อย"
user1032613

22
สิ่งนี้ใช้ได้กับฉัน dataTable.DefaultView.Sort = "Col1, Col2, Col3" รหัสสะอาดน้อย
สาย

7
เช่นเดียวกับ @Sai คุณสามารถแก้ไข DataTable.DefaultView.Sort ได้โดยตรง ไม่จำเป็นต้อง "แยกออก" มุมมองและสร้างตารางใหม่
จอนนี่

40

สิ่งนี้จะช่วยคุณ ...

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

จิตใจดีคิดเหมือนกัน. ฉันกำลังจะโพสต์คำตอบเดียวกันหลังจากอ่าน @ JayR's
Drew Chapin

สำหรับ Column_name cuz ฉันสับสนสิ่งที่เกิดขึ้นในวิธีการแก้ปัญหาของ Jay Riggs :)
23911

วิธีแก้ปัญหาที่ยอดเยี่ยมและง่ายดาย :)
M. Fawad Surosh

25

ใช้ง่ายฟังก์ชั่น. Select

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

และทำเสร็จแล้ว ...... Happy Coding


โปรดทราบว่าถ้าเช่น OP Select("", "CompanyName ASC")คุณมีความสนใจเฉพาะในด้านการเรียงลำดับจากนี้และไม่ต้องการที่จะกรองผลลัพธ์คุณสามารถระบุเช่นนี้
Tawab Wakil

20

บางทีสิ่งต่อไปนี้สามารถช่วยได้:

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

ที่นี่คุณสามารถใช้เคียวรีนิพจน์ Lambda อื่น ๆ ได้เช่นกัน


14

คุณลองใช้Select(filterExpression, sortOrder)วิธีใน DataTable หรือไม่ ดูที่นี่สำหรับตัวอย่าง หมายเหตุวิธีนี้จะไม่เรียงลำดับตารางข้อมูลในกรณีที่เป็นสิ่งที่คุณกำลังมองหา แต่จะส่งกลับอาร์เรย์เรียงแถวโดยไม่ต้องใช้มุมมองข้อมูล


13

หรือถ้าคุณสามารถใช้DataGridViewคุณสามารถโทร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);
        }
    }
}

ซึ่งจะให้ผลลัพธ์ที่ต้องการ:

มุมมองดีบักเกอร์


@vidyasagar ไม่มีปัญหา นอกจากนี้สำหรับการอ้างอิงในอนาคตหากคำตอบมีค่าคุณควรลงคะแนน (ตัวอย่างเช่นฉัน?) และหากคำตอบคือ "THE" คุณควรทำเครื่องหมายว่าเป็นคำตอบ (ตัวอย่างเช่น Jay's)
Gustavo Mori

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

Vidya ต้องการเรียงลำดับโต๊ะของเขาด้วย occr ตามลำดับ ซึ่งรหัสง่าย ๆ ข้างต้นไม่ มันทำสิ่งที่ Jay Riggs (คำตอบที่ยอมรับ) แสดงให้เห็นยกเว้นสิ่งนี้จะกระทำในรหัสบรรทัดเดียว
ivg

2
ข้อเสนอแนะคือการโพสต์ที่ดีกว่า; ในอนาคตสถานที่ที่ข้อมูลเกี่ยวกับรหัสในการตอบสนอง เพราะมันจะเป็นการเพิ่มโอกาสของคนที่ก้าวข้ามการโพสต์หรือแม้กระทั่งเลือกเป็นคำตอบ
ΩmegaMan

5

มี 2 ​​วิธีในการเรียงลำดับข้อมูล

1) การเรียงลำดับข้อมูลและกรอกลงในตาราง:

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) มุมมองเริ่มต้นการเรียงลำดับที่เหมือนกับการเรียงลำดับด้วยส่วนหัวคอลัมน์กริด:

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

1
ขอบคุณสำหรับคำตอบ. วิธีที่คุณ # 1 ช่วยในกรณีของฉัน: ฉันได้รับ IComparer พิเศษมากดังนั้นเพื่อใช้ฉันทำสิ่งนี้:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

ปรากฎว่ามีกรณีพิเศษที่สามารถทำได้ เคล็ดลับคือเมื่อสร้าง DataTable รวบรวมแถวทั้งหมดในรายการเรียงลำดับแล้วเพิ่ม กรณีนี้เพิ่งมาที่นี่


3

// ความหวังนี่จะช่วยคุณได้ ..

        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

ใช้tableObject.Select(queryExpression, sortOrderExpression)เพื่อเลือกข้อมูลในลักษณะที่เรียงลำดับ

ตัวอย่างที่สมบูรณ์

ตัวอย่างการทำงานที่สมบูรณ์- สามารถทดสอบได้ในแอปพลิเคชันคอนโซล :

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

เอาท์พุต

เอาท์พุต


0

ลองนี้:

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) DataTable sortedDT = new DataTable()คุณต้องสร้างตารางใหม่ 2) คุณจำเป็นต้องใช้ImportRow(คุณไม่สามารถเพิ่มแถวจากตารางที่แตกต่างกันได้)
marbel82
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.