如何更改DataTable列的顺序


90

如何在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。
基督教徒

Answers:


231

尝试使用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 2010年

Ofc,您应该对除最后一列之外的所有列使用此方法。
默认语言环境

4
更好的方法体:var colIndex = 0; foreach(columnNames中的var colName)表。Columns[colName] .SetOrdinal(colIndex ++);
JoelFan 2015年

@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中选择的所有列,并按希望的顺序将它们添加回去。


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

请仔细阅读问题。以上查询是C#不jQuery的
艾哈迈德·穆赫塔尔

1
这个答案不仅是错误的语言,问题还在于排序列而不是对行进行排序。您是如何得到这个答案的,更不用说在接受答案之后的8年了?为什么?
jreed121
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.