Jak zmienić kolejność kolumn DataTable

92

Jak zmienić kolejność kolumn z danymi w języku C #.

Przykład:

Utworzono kolejność typu tabeli sql Qty, Unit, Id, ale w programie kolejność DataTable to Id, Qty, Unit. W kodzie Behind am bezpośrednio przekaż DataTable do typu tabeli sql, aby kolejność tabeli była inna.

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

Proszę pomóż

Vyasdev Meledath
źródło
1
czy możesz wyjaśnić, dlaczego chcesz zmienić kolejność kolumn?
KBoek
Utworzono kolejność typu tabeli sql, Qty,Unit,Id ale w programie kolejność DataTable jest Id,Qty,Unit. W kodzie Behind am bezpośrednio przekaż DataTable do typu tabeli sql, aby kolejność tabeli była inna. Dlatego pojawia się pytanie „jak zmienić kolejność kolumn?”
Vyasdev Meledath
6
Po prostu odpowiedz już na OP.
Christian

Odpowiedzi:

233

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

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

AKTUALIZACJA: Ta odpowiedź przyciągnęła dużo więcej uwagi, niż się spodziewałem. Aby uniknąć nieporozumień i ułatwić korzystanie, zdecydowałem się utworzyć metodę rozszerzającą porządkowanie kolumn w DataTable:

Metoda przedłużenia:

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

Stosowanie:

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

lub

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
domyślne ustawienie regionalne
źródło
dając, jak powiedziałeś, strukturę tabeli zmieniono na Qty,Id,Unit only.To chcę Qty,Unit,Id.
Vyasdev Meledath
Oczywiście, powinieneś używać tej metody dla wszystkich kolumn z wyjątkiem ostatniej.
domyślne ustawienia regionalne
4
treść lepszej metody: var colIndex = 0; foreach (zmienna nazwa_kolumny w nazwachkolumn) table.Columns [nazwa_kolumny] .SetOrdinal (colIndex ++);
JoelFan
@JoelFan Zaktualizowałem moją odpowiedź, dziękuję! Twój kod zdecydowanie wygląda na bardziej przejrzysty.
domyślny język
1
bardzo pomocny, tnx.
jonathana
6

Jest to oparte na odpowiedzi „default locale”, ale usunie nieprawidłowe nazwy kolumn przed ustawieniem liczby porządkowej. Dzieje się tak, ponieważ jeśli przypadkowo wyślesz nieprawidłową nazwę kolumny, to zakończy się niepowodzeniem, a jeśli umieścisz kontrolę, aby zapobiec niepowodzeniu, indeks byłby nieprawidłowy, ponieważ pomijałby 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));
        }
}
Soenhay
źródło
2

Wiem, że to jest naprawdę stare pytanie… i wygląda na to, że otrzymałem odpowiedź… Ale otrzymałem to samo pytanie, ale z innym powodem, więc zadziałała dla mnie nieco inna odpowiedź. Mam ładny ogólny datagridview wielokrotnego użytku, który pobiera dostarczone do niego źródło danych i po prostu wyświetla kolumny w ich domyślnej kolejności. Aliasy, kolejność i wybór kolumn umieszczam w projektancie na poziomie tableadapter zbioru danych. Jednak zmiana kolejności kolumn zapytania wybierającego nie wydaje się wpływać na kolumny zwracane przez zestaw danych. Znalazłem jedyny sposób na zrobienie tego w projektancie, to usunięcie wszystkich kolumn wybranych w tableadapter i dodanie ich z powrotem w kolejności, w jakiej chcesz je zaznaczyć.

da Bich
źródło
1

Jeśli masz więcej niż 2-3 kolumny, nieSetOrdinal jest to dobry sposób. Metoda DataView akceptuje tablicę parametrów nazw kolumn. Zamów kolumny tam:ToTable

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
Brent McKain
źródło
0

Możemy użyć tej metody do zmiany indeksu kolumn, ale należy ją zastosować do wszystkich kolumn, jeśli jest więcej niż dwie liczby kolumn, w przeciwnym razie pokaże wszystkie niewłaściwe wartości z tabeli danych ............ ........

Santosh
źródło
-3

Zmiana kolejności danych Tabela na podstawie pewnych warunków lub zaznaczone pole wyboru. 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();
                    }
satya prakash
źródło
Przeczytaj uważnie pytanie. Powyższe zapytanie dotyczy języka c #, a nie jquery
Ahmad Mukhtar,
1
Ta odpowiedź jest nie tylko w złym języku, ale pytanie dotyczyło kolejności kolumn, a nie sortowania wierszy. Jak doszedłeś do tej odpowiedzi, nie mówiąc już o ponad 8 lat po zaakceptowanej odpowiedzi? Czemu?
jreed121