[c#] DataTable 열 순서를 변경하는 방법

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`

도와주세요



답변

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


답변

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

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


답변

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


답변

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

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


답변

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


답변

일부 조건 또는 체크 박스에 따라 데이터 테이블을 재정렬합니다. 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();
                    }


답변