Как изменить порядок столбцов DataTable
Как изменить порядок столбцов Datatable в С#.
Пример:
am Созданный 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`
Пожалуйста, помогите
Ответы
Ответ 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"});
Ответ 2
Это основано на ответе "default locale", но до установки порядкового номера он удалит недопустимые имена столбцов. Это связано с тем, что, если вы случайно отправили недопустимое имя столбца, оно будет терпеть неудачу, и если вы поместите чек, чтобы предотвратить его сбой, тогда индекс будет неправильным, поскольку он будет пропускать индексы везде, где было передано недопустимое имя столбца.
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
Я знаю, что это действительно старый вопрос.. и, похоже, на него ответили. Но я попал сюда с тем же вопросом, но по другой причине, и поэтому для меня был несколько другой ответ.
У меня есть хороший многоразовый общий datagridview, который передает предоставленный ему источник данных и просто отображает столбцы в порядке по умолчанию.
Я поставил псевдонимы и порядок столбцов и их выбор на уровне таблицы набора данных в дизайнере.
Однако изменение порядка запросов выбора столбцов не влияет на столбцы, возвращаемые через набор данных.
Я нашел единственный способ сделать это в дизайнере - удалить все столбцы, выбранные в таблице, добавив их обратно в том порядке, в котором вы хотите их выбрать.
Ответ 4
Вы также можете использовать:
dataview v=dt.defaultview; // ( dt datatable)
v.sort="columnName ASC"; // ASC / DESC for ascending / descending order
dt=v.toTable();
взято из https://social.msdn.microsoft.com/Forums/vstudio/en-US/6ae0341f-d8d7-4082-ae37-19e46f37306a/how-to-sort-columns-in-datatable?forum=wpf
Ответ 5
Мы можем использовать этот метод для изменения индекса столбца, но должны применяться ко всем столбцам, если число столбцов больше двух, иначе оно отображает все неправильные значения из таблицы данных....................
Ответ 6
Переупорядочение данных. Таблица на основе некоторых условий или флажок установлен. ПФБ: -
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();
}