2010-09-21 3 views
65

Come modificare l'ordine delle colonne Datatable in C#.Come modificare l'ordine delle colonne DataTable

Esempio:

am SQL creato tipo di tabella ordine è Quantità, Unità, Id ma nel programma di fine DataTable è Id, Quantità, Unità. Nel codice Behind am passa 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` 

Si prega di aiutare

+3

Questo è più una caratteristica interfaccia utente che è possibile cambiare definendo colonne della griglia isnt'it? –

+1

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

+0

l'ordine del tipo di tabella sql creato è 'Qtà, Unità, Id 'ma nel programma l'ordine DataTable è' Id, Qty, Unit'.Nel codice Behind am passa direttamente DataTable al tipo di tabella sql in modo che l'ordine della tabella sia diverso.Qual è il motivo per cui viene chiesto "come modificare l'ordine delle colonne?" –

risposta

158

tenta di utilizzare il metodo DataColumn.SetOrdinal. Per esempio:

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

UPDATE: Questa risposta ha ricevuto molta più attenzione di quanto mi aspettassi. Per evitare confusione e rendere più semplice l'utilizzo ho deciso di creare un metodo di estensione per la colonna ordine 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++; 
     } 
    } 
} 

Usage:

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

o

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

dando come hai detto, la struttura della tabella è stata modificata in "Qtà, Id, Unità". Voglio questo come "Qtà, Unità, Id". –

+0

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

+1

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

0

We 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 .......... ..........

6

Questo è basato sulla risposta della "localizzazione predefinita" ma rimuoverà i nomi di colonna non validi prima di impostare l'ordinale. Questo perché se invii accidentalmente un nome di colonna non valido, esso fallirebbe e se inserissi un controllo per impedire che fallisse, l'indice sarebbe errato poiché saltererebbe 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)); 
     } 
} 
1

So che questa è una domanda molto vecchia .. e sembra che sia stata risposta .. Ma sono arrivato qui con la stessa domanda ma una ragione diversa per la domanda, e quindi una risposta leggermente diversa ha funzionato per me. Ho un datagridview generico riutilizzabile che prende l'origine dati fornita e mostra semplicemente le colonne nel loro ordine predefinito. Ho messo gli alias e l'ordine delle colonne e la selezione al livello di tableadapter del set di dati nel designer. Tuttavia, la modifica dell'ordine di query di colonne selezionato non sembra influire sulle colonne restituite attraverso il set di dati. Ho trovato l'unico modo per farlo nel designer, è quello di rimuovere tutte le colonne selezionate all'interno del tableadapter, aggiungendole di nuovo nell'ordine in cui le vuoi selezionate.