【问题标题】:How to change DataTable columns order如何更改 DataTable 列的顺序
【发布时间】: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。

标签: c# datatable


【解决方案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://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));
        }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          更改数据表列顺序

          输入:数据表列顺序

          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

          【讨论】:

            【解决方案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 年多之后了?为什么?
            猜你喜欢
            • 2021-01-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多