Подтвердить что ты не робот

Как изменить порядок столбцов 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` 

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

4b9b3361

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

Ответ 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();
                    }