如何更改 DataTable 列的顺序
Posted
技术标签:
【中文标题】如何更改 DataTable 列的顺序【英文标题】:How to change DataTable columns order 【发布时间】: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。
【参考方案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://***.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】:更改数据表列顺序
输入:数据表列顺序
列
-
COLUMN1
COLUMN2
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 列顺序
列
-
COLUMN3
COLUMN2
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 年多之后了?为什么?以上是关于如何更改 DataTable 列的顺序的主要内容,如果未能解决你的问题,请参考以下文章
.net中,如何更改datatable.columns.datatype中的数据类型为长时间