Как изменить порядок столбцов DataTable
Как изменить порядок столбцов Datatable в c#.
пример:
Я создал таблица заказа тип данных-количество,единица измерения,код но в программе объект DataTable того, это ID,кол., шт. В код позади, я прямо передать объект DataTable в SQL типа в таблице, поэтому порядок таблица разных.
DataTable columns are: `Id,Qty,Unit.` I want this to be: `Qty,Unit,Id`
пожалуйста, помогите
5 ответов:
попробуйте использовать 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"});
это основано на ответе "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)); } }
Я знаю, что это очень старый вопрос.. и, похоже, на него ответили.. Но я пришел сюда с тем же вопросом, но по другой причине вопроса, и поэтому немного другой ответ сработал для меня. У меня есть хороший многоразовый универсальный datagridview, который принимает источник данных, предоставленный ему, и просто отображает столбцы в их порядке по умолчанию. Я помещаю псевдонимы и порядок столбцов и выбор на уровне tableadapter набора данных в designer. Однако изменение порядка запроса select столбцов похоже, что это не влияет на столбцы, возвращаемые через набор данных. Я нашел единственный способ сделать это в конструкторе, это удалить все столбцы, выбранные в адаптере таблиц, добавив их обратно в том порядке, в котором вы хотите их выбрать.