DataTable 열 순서를 변경하는 방법


92

C #에서 Datatable 열 순서를 변경하는 방법.

예:

SQL 테이블 유형 순서는 Qty, Unit, Id이지만 프로그램 DataTable 순서는 Id, Qty, Unit입니다. 코드 Behind에서 DataTable을 SQL 테이블 유형에 직접 전달하므로 테이블 순서가 다릅니다.

DataTable columns are: `Id,Qty,Unit.`  I want this to be: `Qty,Unit,Id` 

도와주세요


1
열 순서를 변경하려는 이유를 설명해 주시겠습니까?
KBoek

SQL 테이블 유형 순서가 생성 Qty,Unit,Id 되었지만 프로그램 DataTable 순서는 Id,Qty,Unit. Code Behind에서는 DataTable을 SQL 테이블 유형에 직접 전달하므로 테이블 순서가 다르기 때문에 "열 순서를 변경하는 방법"이라는 질문이 표시됩니다.
Vyasdev Meledath

6
이미 OP에 대답하십시오.
기독교

답변:


234

DataColumn.SetOrdinal 메서드를 사용해보십시오 . 예를 들면 :

dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1); 

업데이트 : 이 답변은 내가 예상했던 것보다 훨씬 더 많은 관심을 받았습니다. 혼동을 피하고 사용하기 쉽도록 DataTable에서 열 순서 지정을위한 확장 메서드를 만들기로 결정했습니다.

연장 방법 :

public static class DataTableExtensions
{
    public static void SetColumnsOrder(this DataTable table, params String[] columnNames)
    {
        int columnIndex = 0;
        foreach(var columnName in columnNames)
        {
            table.Columns[columnName].SetOrdinal(columnIndex);
            columnIndex++;
        }
    }
}

용법:

table.SetColumnsOrder("Qty", "Unit", "Id");

또는

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});

말씀하신대로 테이블 구조가 Qty,Id,Unit only로 변경되었습니다 Qty,Unit,Id.
Vyasdev Meledath

Ofc, 마지막을 제외한 모든 열에 대해이 방법을 사용해야합니다.
기본 로케일

4
더 나은 메서드 본문 : var colIndex = 0; foreach (columnNames의 var colName) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan

@JoelFan 내 답변을 업데이트했습니다. 감사합니다! 코드가 확실히 깔끔해 보입니다.
기본 로케일

1
매우 도움이됩니다, tnx.
jonathana

6

이것은 "기본 로케일"의 대답을 기반으로하지만 서수를 설정하기 전에 유효하지 않은 열 이름을 제거합니다. 이는 실수로 잘못된 열 이름을 보내면 실패하고 실패하지 않도록 검사하면 잘못된 열 이름이 전달 될 때마다 인덱스를 건너 뛰므로 인덱스가 잘못되기 때문입니다.

public static class DataTableExtensions
{
    /// <summary>
    /// SetOrdinal of DataTable columns based on the index of the columnNames array. Removes invalid column names first.
    /// </summary>
    /// <param name="table"></param>
    /// <param name="columnNames"></param>
    /// <remarks> http://stackoverflow.com/questions/3757997/how-to-change-datatable-colums-order</remarks>
    public static void SetColumnsOrder(this DataTable dtbl, params String[] columnNames)
    {
        List<string> listColNames = columnNames.ToList();

        //Remove invalid column names.
        foreach (string colName in columnNames)
        {
            if (!dtbl.Columns.Contains(colName))
            {
                listColNames.Remove(colName);
            }
        }

        foreach (string colName in listColNames)
        {
            dtbl.Columns[colName].SetOrdinal(listColNames.IndexOf(colName));
        }
}

2

나는 이것이 정말로 오래된 질문이라는 것을 알고 있습니다. 그리고 그것이 대답 된 것처럼 보입니다. 그러나 나는 같은 질문으로 여기에 왔지만 질문에 대한 다른 이유가 있었기 때문에 약간 다른 대답이 저에게 효과적이었습니다. 제공된 데이터 소스를 가져오고 기본 순서로 열을 표시하는 재사용 가능한 일반 datagridview가 있습니다. 디자이너에서 데이터 세트의 tableadapter 수준에서 별칭과 열 순서 및 선택을 입력했습니다. 그러나 열의 선택 쿼리 순서를 변경해도 데이터 세트를 통해 반환되는 열에 영향을 미치지 않는 것 같습니다. 디자이너에서이 작업을 수행하는 유일한 방법은 tableadapter에서 선택한 모든 열을 제거하고 선택한 순서대로 다시 추가하는 것입니다.


1

이상의 2 ~ 3 열이있는 경우 SetOrdinal입니다 하지 가는 방법. DataView의 ToTable메서드는 열 이름의 매개 변수 배열을받습니다. 거기에서 열을 주문하십시오.

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");

0

열 인덱스를 변경하는 데이 방법을 사용할 수 있지만 두 개 이상의 열이있는 경우 모든 열에 적용해야합니다. 그렇지 않으면 데이터 테이블의 모든 부적절한 값을 표시합니다 ............. ........


-3

일부 조건 또는 체크 박스에 따라 데이터 테이블을 재정렬합니다. PFB :-

 var tableResult= $('#exampleTable').DataTable();

    var $tr = $(this).closest('tr');
    if ($("#chkBoxId").prop("checked")) 
                    {
                        // re-draw table shorting based on condition
                        tableResult.row($tr).invalidate().order([colindx, 'asc']).draw();
                    }
                    else {
                        tableResult.row($tr).invalidate().order([colindx, "asc"]).draw();
                    }

질문을주의 깊게 읽으십시오. 위 쿼리는 JQuery와에 대한 C #을위한 것이 아닙니다
아흐마드 무크 타르

1
이 대답은 잘못된 언어에 대한 것일뿐만 아니라 행을 정렬하지 않고 열을 정렬하는 것이 었습니다. 이 답변이 받아 들여진 지 8 년이 지났지 만 어떻게이 답변에 도달 했습니까? 왜?
jreed121
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.