Come modificare l'ordine delle colonne di DataTable


91

Come modificare l'ordine delle colonne Datatable in c #.

Esempio:

L'ordine del tipo di tabella sql creato è Qty, Unit, Id ma nel programma DataTable order è Id, Qty, Unit. Nel codice Behind sono passato direttamente DataTable al tipo di tabella sql in modo che l'ordine della tabella sia diverso.

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

Per favore aiuto


1
puoi spiegare perché vorresti cambiare l'ordine delle colonne?
KBoek

L'ordine del tipo di tabella SQL creato è Qty,Unit,Id ma nell'ordine DataTable del programma è Id,Qty,Unit. Nel codice Behind sono passato direttamente DataTable al tipo di tabella sql in modo che l'ordine della tabella sia diverso. Ecco perché mi viene chiesto "come modificare l'ordine delle colonne?"
Vyasdev Meledath,

6
Basta rispondere già all'OP.
Christian

Risposte:


232

Prova a utilizzare il metodo DataColumn.SetOrdinal . Per esempio:

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

AGGIORNAMENTO: Questa risposta ha ricevuto molta più attenzione di quanto mi aspettassi. Per evitare confusione e semplificarne l'utilizzo, ho deciso di creare un metodo di estensione per l'ordinamento delle colonne in DataTable:

Metodo di estensione:

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

Utilizzo:

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

o

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

dando come hai detto, la struttura della tabella è cambiata in Qty,Id,Unit solo. Voglio così Qty,Unit,Id.
Vyasdev Meledath,

Ofc, dovresti usare questo metodo per tutte le colonne tranne l'ultima.
locale predefinito

4
corpo del metodo migliore: var colIndex = 0; foreach (var colName in columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan

@JoelFan ho aggiornato la mia risposta, grazie! Il tuo codice sembra decisamente più pulito.
locale predefinito

1
molto utile, tnx.
jonathana

6

Si basa sulla risposta "impostazioni internazionali predefinite" ma rimuoverà i nomi di colonna non validi prima di impostare l'ordinale. Questo perché se invii accidentalmente un nome di colonna non valido, fallirà e se metti un segno di spunta per evitare che fallisca, l'indice sarebbe sbagliato poiché salterebbe gli indici ovunque fosse passato un nome di colonna non valido.

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

So che questa è una domanda molto vecchia .. e sembra che abbia avuto risposta .. Ma sono arrivato qui con la stessa domanda ma un motivo diverso per la domanda, e quindi una risposta leggermente diversa ha funzionato per me. Ho un bel datagridview generico riutilizzabile che prende l'origine dati fornita e visualizza solo le colonne nel loro ordine predefinito. Inserisco gli alias e l'ordine e la selezione delle colonne a livello di tableadapter del set di dati nella finestra di progettazione. Tuttavia, la modifica dell'ordine di selezione delle colonne delle query non sembra influire sulle colonne restituite tramite il set di dati. Ho trovato l'unico modo per farlo nel designer, è rimuovere tutte le colonne selezionate all'interno del tableadapter, aggiungendole di nuovo nell'ordine in cui desideri che siano selezionate.


1

Se hai più di 2-3 colonne, nonSetOrdinal è la strada da percorrere. Il metodo di un DataView accetta una matrice di parametri di nomi di colonna. Ordina lì le tue colonne:ToTable

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

0

Possiamo usare questo metodo per cambiare l'indice della colonna ma dovrebbe essere applicato a tutte le colonne se ci sono più di due numeri di colonne altrimenti mostrerà tutti i valori impropri dalla tabella dati ............ ........


-3

Riordino tabella dati in base a una condizione o casella di controllo selezionata. 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();
                    }

Si prega di leggere attentamente la domanda. La query sopra è per c # non per jquery
Ahmad Mukhtar

1
Non solo questa risposta è per la lingua sbagliata, la domanda era per ordinare le colonne e non per ordinare le righe. Come sei arrivato a questa risposta, figuriamoci oltre 8 anni dopo la sua risposta accettata? Perché?
jreed121
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.