如何更改DataTable列顺序
如何在c#中更改Datatable列顺序。
例:
我创build的SQL表types顺序是数量,单位,但在程序DataTable顺序是Id,数量,单位。 在代码后面直接传递DataTable到SQL表types,所以表顺序是不同的。
DataTable columns are: `Id,Qty,Unit.` I want this to be: `Qty,Unit,Id`
请帮忙
尝试使用DataColumn.SetOrdinal方法。 例如:
dataTable.Columns["Qty"].SetOrdinal(0); dataTable.Columns["Unit"].SetOrdinal(1);
更新:这个答案收到比我预期的更多的关注。 为了避免混淆,使其更易于使用,我决定在DataTable中为列sorting创build一个扩展方法:
扩展方法:
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"});
这是基于“默认语言环境”的答案,但它会删除无效的列名称之前设置序号。 这是因为如果你不小心发送了一个无效的列名,那么它会失败,如果你把一个检查,以防止失败索引将是错误的,因为它会跳过索引无论列名传入。
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)); } }
我知道这是一个非常古老的问题,而且似乎已经得到了答案..但是我在这里得到了同样的问题,但是问题的原因不同,所以稍微有点不同的答案对我有用。 我有一个很好的可重复使用的genericsdatagridview,它提供的数据源,只是按默认的顺序显示列。 在devise器中,我将别名和列顺序以及select放在数据集的tableadapter级别。 但是,更改列的select查询顺序似乎不会影响通过数据集返回的列。 我发现在devise器中这样做的唯一方法是删除tableadapter中选定的所有列,并按照您希望select的顺序将其添加回来。
你也可以使用:
dataview v=dt.defaultview; // ( dt datatable) v.sort="columnName ASC"; // ASC / DESC for ascending / descending order dt=v.toTable();
我们可以使用这个方法来改变列索引,但是如果有两个以上的列数,应该应用到所有的列,否则它会显示数据表中所有的错误值………… ……..