So ändern Sie die Reihenfolge der DataTable-Spalten


87

So ändern Sie die Reihenfolge der datierbaren Spalten in c #.

Beispiel:

Ich bin erstellt SQL-Tabellentyp Reihenfolge ist Menge, Einheit, ID, aber im Programm DataTable Reihenfolge ist ID, Menge, Einheit. Übergeben Sie im Code Behind am direkt DataTable an den SQL-Tabellentyp, sodass die Tabellenreihenfolge unterschiedlich ist.

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

Bitte helfen Sie


1
Können Sie erklären, warum Sie die Spaltenreihenfolge ändern möchten?
KBoek

bin erstellt SQL-Tabellentyp Reihenfolge ist Qty,Unit,Id aber im Programm DataTable Reihenfolge ist Id,Qty,Unit. Im Code Behind am wird DataTable direkt an den SQL-Tabellentyp übergeben, sodass die Tabellenreihenfolge unterschiedlich ist. Warum wird gefragt, wie die Spaltenreihenfolge geändert werden soll?
Vyasdev Meledath

5
Beantworten Sie einfach das OP bereits.
Christian

Antworten:


227

Versuchen Sie, die DataColumn.SetOrdinal- Methode zu verwenden. Beispielsweise:

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

UPDATE: Diese Antwort erhielt viel mehr Aufmerksamkeit als ich erwartet hatte. Um Verwirrung zu vermeiden und die Verwendung zu vereinfachen, habe ich beschlossen, eine Erweiterungsmethode für die Spaltenreihenfolge in DataTable zu erstellen:

Verlängerungsmethode:

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

Verwendung:

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

oder

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});

Durch das Geben, wie Sie sagten, wurde die Tabellenstruktur in " Qty,Id,Unit Nur" geändert. Ich möchte dies Qty,Unit,Id.
Vyasdev Meledath

Natürlich sollten Sie diese Methode für alle Spalten außer der letzten verwenden.
Standardgebietsschema

3
besserer Methodenkörper: var colIndex = 0; foreach (var colName in columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan

@ JoelFan Ich habe meine Antwort aktualisiert, danke! Ihr Code sieht definitiv sauberer aus.
Standardgebietsschema

1
sehr hilfreich, tnx.
Jonathana

6

Dies basiert auf der Antwort des "Standardgebietsschemas", entfernt jedoch ungültige Spaltennamen, bevor die Ordnungszahl festgelegt wird. Dies liegt daran, dass wenn Sie versehentlich einen ungültigen Spaltennamen senden, dieser fehlschlägt und wenn Sie eine Prüfung durchführen, um zu verhindern, dass er fehlschlägt, der Index falsch ist, da Indizes überall dort übersprungen werden, wo ein ungültiger Spaltenname übergeben wurde.

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

Ich weiß, dass dies eine wirklich alte Frage ist. Und es scheint, dass sie beantwortet wurde. Aber ich bin mit derselben Frage hierher gekommen, aber mit einem anderen Grund für die Frage, und so hat eine etwas andere Antwort für mich funktioniert. Ich habe eine schöne wiederverwendbare generische Datagrid-Ansicht, die die bereitgestellte Datenquelle verwendet und nur die Spalten in ihrer Standardreihenfolge anzeigt. Ich habe Aliase, Spaltenreihenfolge und Auswahl auf Tableadapter-Ebene des Datasets in Designer eingefügt. Das Ändern der Auswahlabfragereihenfolge von Spalten scheint jedoch keine Auswirkungen auf die durch das Dataset zurückgegebenen Spalten zu haben. Ich habe die einzige Möglichkeit gefunden, dies im Designer zu tun, indem alle im Tableadapter ausgewählten Spalten entfernt und in der Reihenfolge hinzugefügt werden, in der sie ausgewählt werden sollen.


1

Wenn Sie mehr als 2-3 Spalten haben, SetOrdinalist dies nicht der richtige Weg. Die ToTableMethode von DataView akzeptiert ein Parameterarray von Spaltennamen. Bestellen Sie dort Ihre Spalten:

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

0

Wir können diese Methode zum Ändern des Spaltenindex verwenden, sollten jedoch auf alle Spalten angewendet werden, wenn mehr als zwei Spalten vorhanden sind. Andernfalls werden alle falschen Werte aus der Datentabelle angezeigt. ........


-3

Daten nachbestellen Tabelle basierend auf einer Bedingung oder einem Kontrollkästchen aktiviert. 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();
                    }

Bitte lesen Sie die Frage sorgfältig durch. Die obige Abfrage bezieht sich auf c #, nicht auf jquery
Ahmad Mukhtar,

1
Diese Antwort ist nicht nur für die falsche Sprache, sondern auch für die Bestellung von Spalten, die keine Zeilen sortieren. Wie sind Sie zu dieser Antwort gekommen, geschweige denn über 8 Jahre nach ihrer akzeptierten Antwort? Warum?
jreed121
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.