DataTable列の順序を変更する方法


91

C#でDatatable列の順序を変更する方法。

例:

作成されたSQLテーブルタイプの順序はQty、Unit、Idですが、プログラムではDataTableの順序はId、Qty、Unitです。コードビハインドでは、DataTableをSQLテーブルタイプに直接渡すため、テーブルの順序が異なります。

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

助けてください


1
列の順序を変更する理由を説明できますか?
KBoek 2010

作成されたSQLテーブルタイプの順序はですQty,Unit,Id が、プログラムではDataTableの順序はId,Qty,Unitです。コードビハインドでは、DataTableをSQLテーブルタイプに直接渡すため、テーブルの順序が異なります。そのため、「列の順序を変更する方法」を尋ねられます。
Vyasdev Meledath 2010

6
すでにOPに答えるだけです。
クリスチャン

回答:


232

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 おっしゃるように与えることで、テーブルの構造がのみに変わりました。 こんな感じで欲しいです Qty,Unit,Id
Vyasdev Meledath 2010

多くの場合、最後の列を除くすべての列にこのメソッドを使用する必要があります。
デフォルトロケール

4
より良いメソッド本体:var colIndex = 0; foreach(var colName in columnNames)table.Columns [colName] .SetOrdinal(colIndex ++);
JoelFan 2015

@JoelFan回答を更新しました、ありがとうございます!あなたのコードは間違いなくきれいに見えます。
デフォルトロケール

1
とても役に立ちました、tnx。
jonathana 2016

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があります。エイリアスと列の順序および選択を、デザイナーのデータセットのテーブルアダプターレベルに配置します。ただし、列の選択クエリの順序を変更しても、データセットを通じて返される列には影響しないようです。デザイナでこれを行う唯一の方法は、テーブルアダプタ内で選択されたすべての列を削除し、選択したい順序で追加し直すことです。


1

2〜3列を超える場合は、これが適切な方法でSetOrdinalはありません。DataViewのToTableメソッドは、列名のパラメーター配列を受け入れます。そこで列を注文します。

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

0

この方法を使用して列インデックスを変更できますが、列数が3つ以上ある場合はすべての列に適用する必要があります。そうでない場合は、データテーブルのすべての不適切な値が表示されます............ .......。


-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#用です
AhmadMukhtar19年

1
この答えは間違った言語であるだけでなく、問題は行を並べ替えるのではなく列を並べ替えることでした。受け入れられてから8年以上経ったことは言うまでもなく、どのようにしてこの答えにたどり着きましたか?どうして?
jreed121
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.