데이터 테이블에서 행 정렬


146

에 두 개의 열 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를 정렬하려고 DataTable합니다 DataView.

답변:


355

원하는 것처럼 들리는 것처럼 일종의 DataTable을 쉽게 수행 할 수 없습니다.

수행 할 수있는 작업은 원래 DataTable에서 만든 DataView에서 새 DataTable을 만드는 것입니다. DataView에 원하는 정렬 및 / 또는 필터를 적용한 다음 DataView.ToTable 메서드를 사용하여 DataView 에서 새 DataTable을 만듭니다 .

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

나는 가격 값의 관점에서 오름차순 값을 원합니다. 어떻게합니까?
Ranjith Kumar Nagiri

이 접근법은 괜찮아 보입니다. 그러나 직접적인 방법은 없습니까? 왜 DataTable.sort ( "by")가 없습니까?
Steam

28
감사. 여기서 "occr desc", "occr"은 열 이름이고 "desc"는 "내림차순"을 의미합니다.
user1032613

22
이것은 나를 위해 일했다 dataTable.DefaultView.Sort = "Col1, Col2, Col3". 약간 깨끗한 코드.
Sai

7
@Sai와 마찬가지로 DataTable.DefaultView.Sort를 직접 수정할 수 있습니다. 뷰를 "분할"하고 테이블을 다시 만들 필요가 없습니다.
Jonny

40

이것은 당신을 도울 것입니다 ...

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

큰 마음은 다 비슷 하네. @JayR을 읽은 후 동일한 솔루션을 게시하려고했습니다.
Drew Chapin 2016 년

Column_name cuz의 경우 Jay Riggs의 솔루션에서 occr이 무엇인지 혼동했습니다. :)
Thameem


25

그것의 간단한 사용. 선택 기능.

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

그리고 완료되었습니다 ... 해피 코딩


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).
구스타보 모리

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

Vidya는 테이블을 occr을 기준으로 순서대로 정렬하려고합니다. 위의 간단한 코드는 무엇입니까? Jay Riggs (허용 된 답변)가 보여준 것을 제외하고는 한 줄의 코드로 수행됩니다.
ivg

2
제안은 게시물을 개선하는 것이 었습니다. 나중에 코드에 대한 정보를 응답에 넣습니다. 누군가가 게시물을 올리거나 답변으로 선택할 가능성이 높아지기 때문입니다.
ΩmegaMan 2013

5

정렬 데이터에는 두 가지 방법이 있습니다

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.