Як змінити порядок стовпців таблиці даних


91

Як змінити порядок стовпців таблиць даних у c #.

Приклад:

Створено порядок типу таблиці 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` 

Будь ласка, допоможіть


1
Ви можете пояснити, чому Ви хочете змінити порядок стовпців?
KBoek,

Створено порядок типу таблиці sql, Qty,Unit,Id але в програмі DataTable - порядок Id,Qty,Unit. У коді Behind am безпосередньо передайте DataTable до типу таблиці sql, тому порядок таблиць відрізняється. Ось чому мене запитують "як змінити порядок стовпців?"
Вясдев Меледат

6
Просто дайте відповідь на ОП вже.
Крістіан

Відповіді:


232

Спробуйте використати метод 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 only.Я хочу, як це Qty,Unit,Id.
Вясдев Меледат

Часто, вам слід використовувати цей метод для всіх стовпців, крім останнього.
дефолт за замовчуванням

4
краще тіло методу: var colIndex = 0; foreach (var colName in columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan

@JoelFan Я оновив свою відповідь, дякую! Ваш код, безумовно, виглядає чистішим.
стандартна локалізація

1
дуже корисно, tnx.
Джонатана

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));
        }
}

2

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


1

Якщо у вас більше 2-3 стовпців, SetOrdinalце не шлях. Метод DataView ToTableприймає масив параметрів імен стовпців. Замовляйте свої стовпці там:

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");

0

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


-3

Повторне замовлення таблиці даних на основі певної умови або встановленого прапорця. PFB: -

 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();
                    }

Будь ласка, уважно прочитайте питання. Вгорі запит на c #, а не на jquery
Ахмад Мухтар

1
Це не тільки відповідь на неправильну мову, питання полягав у впорядкуванні стовпців, а не в сортуванні рядків. Як ви дійшли до цієї відповіді, не кажучи вже про 8 років після прийнятої відповіді? Чому?
jreed121
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.