如何在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`
请帮忙
尝试使用 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"});
这是基于“默认语言环境”的答案,但在设置序数之前,它将删除无效的列名。这是因为如果意外发送无效的列名,则会失败,如果放置一个检查来防止失败,则索引将是错误的,因为它会跳过任何传递无效列名的索引。
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> https://dev59.com/hG865IYBdhLWcg3wi_Q2
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));
}
}
我知道这是一个非常老的问题...看起来已经有人回答了...但我因为不同的原因而遇到了相同的问题,所以稍微不同的答案适用于我。 我有一个很好的可重复使用的通用datagridview,它接受提供给它的数据源,并仅以默认顺序显示列。 我在设计器中将别名、列顺序和选择放在数据集的tableadapter级别上。 然而,更改选择查询列的顺序似乎不会影响通过数据集返回的列。 我发现在设计器中唯一的方法是删除表适配器中选择的所有列,然后按照您想要选择的顺序添加它们。
SetOrdinal
不是最佳选择。DataView的ToTable
方法接受一个列名的参数数组。在那里对您的列进行排序:DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
更改DataTable列顺序
输入:DataTable列顺序
列
您需要将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 列顺序
列
根据某些条件或选中复选框重新排序数据表。请参见以下内容:
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();
}
Qty,Unit,Id
,但在程序中 DataTable 的列顺序为Id,Qty,Unit
。在代码后端中,我直接将 DataTable 传递给 SQL 表类型,因此表的顺序不同。这就是为什么我问“如何更改列顺序?” - Vyasdev Meledath