代码之家  ›  专栏  ›  技术社区  ›  Vyasdev Meledath

如何更改数据表列顺序

  •  79
  • Vyasdev Meledath  · 技术社区  · 15 年前

    am created sql表类型order是Qty,Unit,Id,但在程序DataTable中order是Id,Qty,Unit。在代码隐藏中,am直接将DataTable传递给sql表类型,这样表的顺序就不同了。

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

    请帮忙

    6 回复  |  直到 7 年前
        1
  •  235
  •   default locale    10 年前

    试着使用 DataColumn.SetOrdinal 方法。例如:

    dataTable.Columns["Qty"].SetOrdinal(0);
    dataTable.Columns["Unit"].SetOrdinal(1); 
    

    扩展方法:

    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"});
    
        2
  •  6
  •   Soenhay    12 年前

    这是基于“defaultlocale”的答案,但它将在设置序号之前删除无效的列名。这是因为如果您不小心发送了一个无效的列名,那么它将失败;如果您进行了检查以防止失败,那么索引将是错误的,因为无论在哪里传递了无效的列名,它都将跳过索引。

    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
  •  2
  •   da Bich    11 年前

    我知道这是个很老的问题。。似乎有人回答了。。但是我来这里的时候问的是同一个问题,但是问这个问题的原因不同,所以一个稍微不同的答案对我来说是有效的。 我有一个很好的可重用的通用datagridview,它接受提供给它的数据源,只按默认顺序显示列。 我将别名、列顺序和选择放在designer中数据集的tableadapter级别。 但是,更改列的select查询顺序似乎不会影响通过数据集返回的列。 我发现在设计器中实现这一点的唯一方法是删除tableadapter中选择的所有列,并按您希望的顺序重新添加它们。

        4
  •  1
  •   Brent McKain    5 年前

    如果你有超过2-3列, SetOrdinal 走的路。数据视图的 ToTable 方法接受列名的参数数组。在那里排列您的列:

    DataView dataView = dataTable.DefaultView;
    dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
    
        5
  •  0
  •   santosh    12 年前

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

        6
  •  -5
  •   satya prakash    7 年前

    根据某些条件或复选框对数据表重新排序。工艺流程图:-

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