Comment modifier l'ordre des colonnes DataTable


92

Comment modifier l'ordre des colonnes Datatable dans c #.

Exemple:

J'ai créé l'ordre de type de table sql est Qty, Unit, Id mais dans le programme DataTable order est Id, Qty, Unit. Dans le code Behind am, passez directement DataTable au type de table sql afin que l'ordre des tables soit différent.

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

Veuillez aider


1
pouvez-vous expliquer pourquoi vous souhaitez modifier l'ordre des colonnes?
KBoek

Suis créé l'ordre de type de table sql est Qty,Unit,Id mais dans l'ordre du programme DataTable est Id,Qty,Unit. Dans le code Behind am, passez directement DataTable au type de table sql afin que l'ordre de la table soit différent.
Vyasdev Meledath

6
Répondez simplement à l'OP.
Christian

Réponses:


233

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 ce à quoi je m'attendais. Pour éviter toute confusion et faciliter son utilisation, j'ai décidé de créer une méthode d'extension pour l'ordre 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++;
        }
    }
}

Usage:

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

ou

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

en donnant comme vous l'avez dit, la structure de la table a changé pour Qty,Id,Unit seulement.Je veux comme ça Qty,Unit,Id.
Vyasdev Meledath

Ofc, vous devez utiliser cette méthode pour toutes les colonnes sauf la dernière.
locale par défaut

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

@JoelFan J'ai mis à jour ma réponse, merci! Votre code a définitivement l'air plus propre.
locale par défaut

1
très utile, tnx.
jonathana

6

Ceci est basé sur la réponse de "paramètres régionaux par défaut", mais cela supprimera les noms de colonne invalides avant de définir l'ordinal. En effet, si vous envoyez accidentellement un nom de colonne non valide, cela échouera et si vous mettez une coche pour l'empêcher d'échouer, l'index serait erroné car il ignorerait les index partout où un nom de colonne non valide était passé.

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

Je sais que c'est une question vraiment ancienne ... 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 une belle 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 et la sélection des colonnes au niveau de l'adaptateur de table de l'ensemble de données dans le concepteur. Cependant, la modification de l'ordre de requête de sélection des 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 le faire dans le concepteur, c'est de supprimer toutes les colonnes sélectionnées dans l'adaptateur de table, en les rajoutant dans l'ordre dans lequel vous voulez qu'elles soient sélectionnées.


1

Si vous avez plus de 2-3 colonnes, ce SetOrdinaln'est pas la voie à suivre. Une ToTableméthode DataView accepte un tableau de paramètres de noms de colonnes. Commandez vos colonnes là-bas:

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

0

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


-3

Réorganiser le tableau des données en fonction d'une condition ou d'une case à cocher cochée. 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();
                    }

Veuillez lire attentivement la question. La requête ci-dessus est pour c # pas pour jquery
Ahmad Mukhtar

1
Non seulement cette réponse est-elle pour la mauvaise langue, mais la question était de trier les colonnes et non de trier les lignes. Comment êtes-vous arrivé à cette réponse, encore moins plus de 8 ans après sa réponse acceptée? Pourquoi?
jreed121
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.