如何更改DataTable列的顺序

时间:2010-09-21 07:05:58

标签: c# datatable

如何在c#中更改数据表列顺序。

示例:

我创建的sql表类型顺序是Qty,Unit,Id但是在程序DataTable中顺序是Id,Qty,Unit。在代码Behind am中直接将DataTable传递给sql表类型,因此表顺序不同。

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

请帮忙

7 个答案:

答案 0 :(得分:204)

尝试使用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"});

答案 1 :(得分: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 :(得分:2)

我知道这是一个非常古老的问题..而且它似乎得到了回答..但我带着同样的问题来到这里,但问题的原因不同,所以一个稍微不同的答案对我有用。 我有一个很好的可重用的通用datagridview,它接受提供给它的数据源,只显示默认顺序的列。 我将别名和列顺序和选择放在设计器中数据集的tableadapter级别。 但是,更改列的选择查询顺序似乎不会影响通过数据集返回的列。 我发现在设计器中执行此操作的唯一方法是删除tableadapter中选择的所有列,并按照您希望它们选择的顺序添加它们。

答案 3 :(得分:1)

如果您的栏数超过2-3,则SetOrdinal不是 可行的方式。 DataView的ToTable方法接受列名称的参数数组。在此处订购您的列:

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

答案 4 :(得分:0)

我们可以使用此方法更改列索引但是如果列数超过两列则应该应用于所有列,否则它将显示数据表中的所有不正确值......... ...........

答案 5 :(得分:0)

答案 6 :(得分:0)

根据某些条件或复选框重新订购数据表。 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();
                    }