Jak zmienić kolejność kolumn DataTable

Jak zmienić kolejność kolumn w c#.

Przykład:

Am utworzony porządek typu tabeli SQL jest Qty, Unit, Id, ale w programie DataTable kolejność jest Id, Qty, Unit. W kodzie za am bezpośrednio przekazać dane do typu tabeli SQL więc kolejność tabeli jest inna.

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

Proszę o pomoc

Author: micstr, 2010-09-21

5 answers

Spróbuj użyć DataColumn.Metoda SetOrdinal . Na przykład:

dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1); 

Aktualizacja: ta odpowiedź otrzymała znacznie więcej uwagi niż się spodziewałem. Aby uniknąć nieporozumień i ułatwić korzystanie, postanowiłem stworzyć metodę rozszerzenia do porządkowania kolumn w DataTable:

Metoda rozszerzenia:

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

Użycie:

table.SetColumnsOrder("Qty", "Unit", "Id");

Lub

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
 176
Author: default locale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 03:36:42

Jest to oparte na odpowiedzi "default locale", ale usunie nieprawidłowe nazwy kolumn przed ustawieniem kolejności. Dzieje się tak, ponieważ jeśli przypadkowo wyślesz nieprawidłową nazwę kolumny, to zawiedzie, a jeśli umieścisz czek, aby zapobiec jej niepowodzeniu, indeks będzie nieprawidłowy, ponieważ pominie indeksy wszędzie tam, gdzie została przekazana Nieprawidłowa nazwa kolumny.

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));
        }
}
 6
Author: Soenhay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-14 16:40:24

Wiem, że to naprawdę stare pytanie.. i wygląda na to, że zostało to odebrane.. Ale dotarłem tu z tym samym pytaniem, ale z innym powodem pytania, więc trochę inna odpowiedź mi pomogła. Mam ładny generyczny datagridview wielokrotnego użytku, który pobiera źródło danych dostarczone do niego i po prostu wyświetla kolumny w ich domyślnej kolejności. Umieszczam aliasy i kolejność kolumn oraz wybór na poziomie tableadapter zbioru danych w designer. Jednak zmiana kolejności zapytań select kolumn wydaje się, że nie ma wpływu na kolumny zwrócone przez zestaw danych. Znalazłem jedyny sposób, aby to zrobić w Projektancie, jest usunięcie wszystkich kolumn zaznaczonych w tableadapter, dodając je z powrotem w kolejności, w jakiej chcesz je wybrane.

 2
Author: da Bich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 14:26:06

Możesz również użyć:

dataview v=dt.defaultview;  // ( dt  datatable) 
v.sort="columnName ASC";  // ASC / DESC for ascending / descending order 
dt=v.toTable();

Wzięte z https://social.msdn.microsoft.com/Forums/vstudio/en-US/6ae0341f-d8d7-4082-ae37-19e46f37306a/how-to-sort-columns-in-datatable?forum=wpf

 1
Author: depoip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 08:52:53

Możemy użyć tej metody do zmiany indeksu kolumn, ale powinna być zastosowana do wszystkich kolumn jeżeli jest więcej niż dwie liczby kolumn, w przeciwnym razie wyświetli się wszystkie niewłaściwe wartości z tabeli danych....................

 0
Author: santosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 07:09:56