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

92

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

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

Вясдев Меледат
источник
1
Можете ли вы объяснить, почему вы хотите изменить порядок столбцов?
KBoek
порядок создания таблицы sql есть, Qty,Unit,Id а в программе DataTable - порядок Id,Qty,Unit. В коде Behind я напрямую передаю DataTable в тип таблицы sql, поэтому порядок таблиц отличается. Вот почему меня спрашивают: «Как изменить порядок столбцов?»
Вясдев Меледат
6
Просто ответьте уже на OP.
Christian

Ответы:

233

Попробуйте использовать метод 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.
Вясдев Меледат
Конечно, вы должны использовать этот метод для всех столбцов, кроме последнего.
локаль по умолчанию
4
лучшее тело метода: var colIndex = 0; foreach (var colName в columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan
@JoelFan Я обновил свой ответ, спасибо! Ваш код определенно выглядит чище.
локаль по умолчанию
1
очень полезно, спасибо.
jonathana
6

Это основано на ответе "локали по умолчанию", но перед установкой порядкового номера будут удалены недопустимые имена столбцов. Это связано с тем, что, если вы случайно отправите недопустимое имя столбца, он завершится ошибкой, и если вы поставите проверку, чтобы предотвратить его сбой, то индекс будет неправильным, поскольку он будет пропускать индексы везде, где было передано недопустимое имя столбца.

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));
        }
}
Soenhay
источник
2

Я знаю, что это действительно старый вопрос ... и, похоже, на него был дан ответ ... Но я пришел сюда с тем же вопросом, но с другой причиной вопроса, и поэтому у меня сработал немного другой ответ. У меня есть хороший многоразовый общий вид datagridview, который берет предоставленный ему источник данных и просто отображает столбцы в порядке по умолчанию. Я помещаю псевдонимы, порядок столбцов и выбор на уровне адаптера таблицы набора данных в конструкторе. Однако изменение порядка столбцов в запросе выбора не влияет на столбцы, возвращаемые через набор данных. Я обнаружил, что единственный способ сделать это в конструкторе - удалить все столбцы, выбранные в адаптере таблицы, и добавить их обратно в том порядке, в котором вы хотите, чтобы они были выбраны.

да Биш
источник
1

Если у вас более 2-3 столбцов, SetOrdinalэто не лучший вариант. ToTableМетод DataView принимает массив параметров с именами столбцов. Закажите там свои колонки:

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
Брент Маккейн
источник
0

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

Сантош
источник
-3

Переупорядочивание таблицы данных на основе определенного условия или установленного флажка. ПФБ: -

 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();
                    }
сатья пракаш
источник
Пожалуйста, прочтите внимательно вопрос. Вышеупомянутый запрос предназначен для С #, а не для jquery
Ахмад Мухтар
1
Этот ответ не только для неправильного языка, но и вопрос был в том, чтобы упорядочить столбцы, а не строки. Как вы пришли к этому ответу, не говоря уже о том, что прошло более 8 лет после принятого ответа? Зачем?
jreed121