2010-09-21 21 views
65

Comment modifier l'ordre des colonnes de données dans C#.Comment modifier l'ordre des colonnes DataTable

Exemple:

am créé ordre de type table sql est Quantité, Unité, Id mais dans le programme pour DataTable est Id, Qté, unité. Dans le code Behind je passe directement le DataTable au type de table sql donc l'ordre des tables est différent.

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

S'il vous plaît aider

+3

Ceci est plus une caractéristique de l'interface utilisateur que vous pouvez modifier en définissant des colonnes de la grille isnt'it? –

+1

pouvez-vous expliquer pourquoi vous voulez changer l'ordre des colonnes? – KBoek

+0

L'ordre de type table SQL créé est 'Qty, Unit, Id' mais dans l'ordre du programme DataTable est' Id, Qty, Unit'.Dans le code Behind je passe directement DataTable au type de table sql de sorte que l'ordre des tables est différent.C'est pourquoi on me demande "comment changer l'ordre des colonnes?" –

Répondre

158

Essayez d'utiliser la méthode DataColumn.SetOrdinal. Par exemple:

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

MISE À JOUR: Cette réponse a reçu beaucoup plus d'attention que prévu. Pour éviter toute confusion et de le rendre plus facile à utiliser, j'ai décidé de créer une méthode d'extension pour la commande de colonne DataTable:

méthode d'extension:

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

Utilisation:

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

ou

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

en donnant comme vous l'avez dit, la structure de table a changé à «Qty, Id, Unit» seulement. Je veux comme ceci «Qty, Unit, Id». –

+0

Ofc, vous devez utiliser cette méthode pour toutes les colonnes sauf la dernière. –

+1

meilleur corps de la méthode: var colIndex = 0; foreach (var colName dans columnNames) table.Columns [colName] .SetOrdinal (colIndex ++); – JoelFan

0

Nous pouvons utiliser cette méthode pour changer l'index de la colonne, mais il faut l'appliquer à toutes les colonnes s'il y a plus de deux colonnes sinon elle affichera toutes les valeurs incorrectes de la table de données .......... ..........

6

C'est basé sur de la réponse "locale par défaut", mais il supprime les noms de colonnes invalides avant la mise en ordinale. En effet, si vous envoyez accidentellement un nom de colonne invalide, il échouera et si vous mettez un chèque pour l'empêcher de ne pas alors l'indice serait erroné car il sauterait des indices où a été adopté un nom de colonne non valide dans.

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

Je sais que c'est une question très ancienne .. et il semble qu'il a été répondu .. mais je suis arrivé ici avec la même question, mais une autre raison de la question, et donc une réponse légèrement différente a fonctionné pour moi. J'ai une belle grille de données générique réutilisable qui prend la source de données qui lui est fournie et affiche simplement les colonnes dans leur ordre par défaut. Je mets les alias et l'ordre des colonnes et la sélection au niveau tableadapter de l'ensemble de données dans le concepteur. Toutefois, la modification de l'ordre de sélection des requêtes de colonnes ne semble pas avoir d'impact sur les colonnes renvoyées via l'ensemble de données. J'ai trouvé le seul moyen de faire cela dans le concepteur, est de supprimer toutes les colonnes sélectionnées dans le tableadapter, en les rajoutant dans l'ordre dans lequel vous voulez les sélectionner.