如何更改DataTable的列顺序

108

如何在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
我创建了一个 SQL 表类型,其列顺序为 Qty,Unit,Id,但在程序中 DataTable 的列顺序为 Id,Qty,Unit。在代码后端中,我直接将 DataTable 传递给 SQL 表类型,因此表的顺序不同。这就是为什么我问“如何更改列顺序?” - Vyasdev Meledath
7
好的,我会尽快回答原帖问题。 - Christian
7个回答

282

尝试使用 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
当然,除了最后一列,您应该对所有列使用此方法。 - default locale
6
更好的方法体:var colIndex = 0; foreach(var colName in columnNames) table.Columns[colName].SetOrdinal(colIndex++); - JoelFan
1
@JoelFan,我已经更新了我的答案,谢谢!你的代码看起来确实更简洁。 - default locale
2
非常有帮助,谢谢。 - Jonathan Applebaum

8

这是基于“默认语言环境”的答案,但在设置序数之前,它将删除无效的列名。这是因为如果意外发送无效的列名,则会失败,如果放置一个检查来防止失败,则索引将是错误的,因为它会跳过任何传递无效列名的索引。

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> https://dev59.com/hG865IYBdhLWcg3wi_Q2
    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级别上。 然而,更改选择查询列的顺序似乎不会影响通过数据集返回的列。 我发现在设计器中唯一的方法是删除表适配器中选择的所有列,然后按照您想要选择的顺序添加它们。


2
如果您有超过2-3列,SetOrdinal不是最佳选择。DataView的ToTable方法接受一个列名的参数数组。在那里对您的列进行排序:
DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");

0

更改DataTable列顺序

输入:DataTable列顺序

  1. COLUMN1
  2. COLUMN2
  3. 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 列顺序

  1. COLUMN3
  2. COLUMN2
  3. COLUMN1

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

-6

根据某些条件或选中复选框重新排序数据表。请参见以下内容:

 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的。 - Ahmad Mukhtar
2
这个回答不仅是针对错误的语言,而且问题是关于列排序而不是行排序。你是怎么得出这个答案的,更何况是在8年后才回答的?为什么? - jreed121

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接