Как изменить порядок столбцов DataTable


Как изменить порядок столбцов Datatable в c#.

пример:

Я создал таблица заказа тип данных-количество,единица измерения,код но в программе объект DataTable того, это ID,кол., шт. В код позади, я прямо передать объект DataTable в SQL типа в таблице, поэтому порядок таблица разных.

DataTable columns are: `Id,Qty,Unit.`  I want this to be: `Qty,Unit,Id` 

пожалуйста, помогите

5 71

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 столбцов похоже, что это не влияет на столбцы, возвращаемые через набор данных. Я нашел единственный способ сделать это в конструкторе, это удалить все столбцы, выбранные в адаптере таблиц, добавив их обратно в том порядке, в котором вы хотите их выбрать.

вы также можете использовать:

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

мы можем использовать этот метод для изменения индекса столбца, но должны быть применены ко всем столбцам, если их больше двух, иначе он покажет все неправильные значения из таблицы данных....................