Как изменить порядок столбцов Datatable в c #.
Пример:
порядок создания таблицы sql: Qty, Unit, Id, но в программе DataTable порядок равен Id, Qty, Unit. В коде Behind я напрямую передаю DataTable в тип таблицы sql, поэтому порядок таблиц отличается.
DataTable columns are: `Id,Qty,Unit.` I want this to be: `Qty,Unit,Id`
Пожалуйста помоги
Qty,Unit,Id
а в программе DataTable - порядокId,Qty,Unit
. В коде Behind я напрямую передаю DataTable в тип таблицы sql, поэтому порядок таблиц отличается. Вот почему меня спрашивают: «Как изменить порядок столбцов?»Ответы:
Попробуйте использовать метод 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
Я хочу вот так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)); } }
источник
Я знаю, что это действительно старый вопрос ... и, похоже, на него был дан ответ ... Но я пришел сюда с тем же вопросом, но с другой причиной вопроса, и поэтому у меня сработал немного другой ответ. У меня есть хороший многоразовый общий вид datagridview, который берет предоставленный ему источник данных и просто отображает столбцы в порядке по умолчанию. Я помещаю псевдонимы, порядок столбцов и выбор на уровне адаптера таблицы набора данных в конструкторе. Однако изменение порядка столбцов в запросе выбора не влияет на столбцы, возвращаемые через набор данных. Я обнаружил, что единственный способ сделать это в конструкторе - удалить все столбцы, выбранные в адаптере таблицы, и добавить их обратно в том порядке, в котором вы хотите, чтобы они были выбраны.
источник
Если у вас более 2-3 столбцов,
SetOrdinal
это не лучший вариант.ToTable
Метод DataView принимает массив параметров с именами столбцов. Закажите там свои колонки:DataView dataView = dataTable.DefaultView; dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
источник
Мы можем использовать этот метод для изменения индекса столбца, но его следует применять ко всем столбцам, если количество столбцов больше двух, иначе он покажет все неправильные значения из таблицы данных ............ ........
источник
Переупорядочивание таблицы данных на основе определенного условия или установленного флажка. ПФБ: -
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(); }
источник