如何更改 DataTable 列的顺序

Posted

技术标签:

【中文标题】如何更改 DataTable 列的顺序【英文标题】:How to change DataTable columns order 【发布时间】:2011-04-15 01:16:33 【问题描述】:

如何在 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` 

请帮忙

【问题讨论】:

您能解释一下为什么要更改列顺序吗? 我创建的 sql 表类型顺序是 Qty,Unit,Id 但在程序中 DataTable 顺序是 Id,Qty,Unit。在代码后面我直接将DataTable传递给sql表类型所以表顺序不同。这就是为什么问“如何更改列顺序?” 已经回答了OP。 【参考方案1】:

尝试使用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 Ofc,您应该对除最后一列之外的所有列使用此方法。 更好的方法体:var colIndex = 0; foreach (var colName in columnNames) table.Columns[colName].SetOrdinal(colIndex++); @JoelFan 我已经更新了我的答案,谢谢!你的代码肯定看起来更干净。 非常有帮助,tnx。【参考方案2】:

这是基于“默认语言环境”的答案,但它会在设置序数之前删除无效的列名。这是因为如果你不小心发送了一个无效的列名,那么它会失败,如果你检查以防止它失败,那么索引就会出错,因为它会在传入无效列名的地方跳过索引。

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://***.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));
        

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

如果您有超过 2-3 列,SetOrdinal不是的方法。 DataView 的ToTable 方法接受列名的参数数组。在那里订购您的专栏:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

更改数据表列顺序

输入:数据表列顺序

    COLUMN1 COLUMN2 COLUMN3

您需要将 DataTable 传递给下面的方法并根据您的意愿设置顺序

private void ProcessDataTable(DataTable dt)

        //Setting Column Orders
        dt.Columns["COLUMN3"].SetOrdinal(0);
        dt.Columns["COLUMN2"].SetOrdinal(1);
        dt.Columns["COLUMN1"].SetOrdinal(2);

输出:DataTable 列顺序

    COLUMN3 COLUMN2 COLUMN1

【讨论】:

【参考方案7】:

根据某些条件重新排序数据表或选中复选框。 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 这个答案不仅是错误的语言,而且问题是对列进行排序而不是对行进行排序。您是如何得出这个答案的,更不用说在接受答案 8 年多之后了?为什么?

以上是关于如何更改 DataTable 列的顺序的主要内容,如果未能解决你的问题,请参考以下文章

更改DataTable某列的值。C#

c# 怎么更改DataTable 中某列的值?

.net中,如何更改datatable.columns.datatype中的数据类型为长时间

如何更改DataFrame列的顺序

如何更改 JQuery.DataTable 中单元格的样式?

更改DataTable中某一列的值