如何更改DataTable列的顺序

Vya*_*Dev 86 c# datatable

如何在c#中更改Datatable列顺序.

例:

我创建的sql表类型顺序是Qty,Unit,Id但是在程序DataTable命令中是Id,Qty,Unit.在代码Behind am中直接将DataTable传递给sql表类型,因此表顺序不同.

DataTable columns are: `Id,Qty,Unit.`  I want this to be: `Qty,Unit,Id` 
Run Code Online (Sandbox Code Playgroud)

请帮忙

def*_*ale 216

尝试使用DataColumn.SetOrdinal方法.例如:

dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1); 
Run Code Online (Sandbox Code Playgroud)

更新:这个答案比我预期的要多得多.为了避免混淆并使其更易于使用,我决定在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++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

table.SetColumnsOrder("Qty", "Unit", "Id");
Run Code Online (Sandbox Code Playgroud)

要么

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
Run Code Online (Sandbox Code Playgroud)

  • 更好的方法体:var colIndex = 0; foreach(columnNames中的var colName)表。Columns[colName] .SetOrdinal(colIndex ++); (2认同)
  • 非常有帮助,tnx。 (2认同)

Soe*_*hay 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));
        }
}
Run Code Online (Sandbox Code Playgroud)