105 votes

Comment modifier l'ordre des colonnes d'un DataTable

Comment changer l'ordre des colonnes d'une table de données en c#.

Ejemplo:

J'ai créé une table sql dont l'ordre est Qty,Unit,Id mais dans le programme DataTable l'ordre est Id,Qty,Unit. Dans le code Behind, je passe directement la DataTable au type de table sql, donc l'ordre de la table est différent.

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

Veuillez m'aider

264voto

default locale Points 4244

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

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

UPDATE : Cette réponse a reçu beaucoup plus d'attention que je ne le pensais. Pour éviter toute confusion et faciliter l'utilisation, j'ai décidé de créer une méthode d'extension pour le classement des colonnes dans 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"});

7voto

Soenhay Points 1455

Cette solution est basée sur la réponse de "default locale" mais elle supprimera les noms de colonnes invalides avant de définir l'ordinal. En effet, si vous envoyez accidentellement un nom de colonne invalide, l'opération échouera et si vous mettez une vérification pour l'empêcher d'échouer, l'index sera erroné puisqu'il sautera les index partout où un nom de colonne invalide a été transmis.

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

2voto

da Bich Points 392

Je sais que c'est une très vieille question et il semble qu'on y ait répondu Mais je suis arrivé ici avec la même question mais une raison différente pour la question, et donc une réponse légèrement différente a fonctionné pour moi. J'ai un joli datagridview 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. J'ai mis les alias, l'ordre des colonnes et la sélection au niveau du tableadapter du dataset dans le designer. Cependant, changer l'ordre des colonnes dans la requête de sélection ne semble pas avoir d'impact sur les colonnes renvoyées par le jeu de données. J'ai trouvé que la seule façon de le faire dans le concepteur est de supprimer toutes les colonnes sélectionnées dans le tableadapter, en les ajoutant à nouveau dans l'ordre dans lequel vous voulez qu'elles soient sélectionnées.

1voto

Brent McKain Points 21

Si vous avez plus de 2-3 colonnes, SetOrdinal es pas la voie à suivre. La fonction ToTable accepte en paramètre un tableau de noms de colonnes. Ordonnez vos colonnes à cet endroit :

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

0voto

santosh Points 11

Nous pouvons utiliser cette méthode pour modifier l'index des colonnes mais elle doit être appliquée à toutes les colonnes s'il y en a plus de deux, sinon elle affichera toutes les valeurs incorrectes du tableau de données.....................

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X