web-dev-qa-db-fra.com

Comment changer l'ordre des colonnes DataTable

Comment changer l'ordre des colonnes datatable en c #.

Exemple:

j'ai créé l'ordre type de table SQL est Qty, Unit, Id mais dans le programme, l'ordre DataTable est Id, Qty, Unit. Dans le code Derrière, 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` 

S'il vous plaît aider

79
Vyas Dev

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

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

UPDATE: Cette réponse a reçu beaucoup plus d'attention que prévu. Pour éviter toute confusion et faciliter l'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++;
        }
    }
}

Utilisation:

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

ou 

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

Ceci est basé sur la réponse de "default locale" mais cela supprimera les noms de colonne non valides avant de définir ordinal. En effet, si vous envoyez accidentellement un nom de colonne non valide, il échouera et si vous faites une vérification pour l'empêcher, alors l'index serait erroné puisqu'il ignorerait les index lorsqu'un nom de colonne non valide était 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));
        }
}
6
Soenhay

Je sais que c’est une question très ancienne… et il semble que la réponse a été donnée… Mais je suis arrivé ici avec la même question, mais avec une raison différente, et une réponse légèrement différente a donc fonctionné pour moi…. Nice datagridview générique réutilisable qui prend la source de données qui lui est fournie et n’affiche que les colonnes dans leur ordre par défaut . Je mets les alias et l’ordre des colonnes et la sélection au niveau du tableadapter du jeu de données dans designer . les colonnes ne semblent pas avoir d'impact sur les colonnes renvoyées par le jeu de données . J'ai trouvé le seul moyen de le faire dans le concepteur, consiste à supprimer toutes les colonnes sélectionnées dans le tableadapter, en les rajoutant dans l'ordre de votre choix. choisi.

2
da Bich

Vous pouvez aussi utiliser:

dataview v=dt.defaultview;  // ( dt  datatable) 
v.sort="columnName ASC";  // ASC / DESC for ascending / descending order 
dt=v.toTable();

extrait de https://social.msdn.Microsoft.com/Forums/vstudio/en-US/6ae0341f-d8d7-4082-ae37-19e46-19376a/how-to-sort-columns-in-datatable?forum=wpf

1
depoip

Re-Ordering data Table basée sur une condition ou 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();
                    }
0
satya prakash

Nous pouvons utiliser cette méthode pour changer l'index des colonnes, mais nous devrions l'appliquer à toutes les colonnes s'il y a plus de deux colonnes, sinon toutes les valeurs impropres de la table de données seront affichées ............ ........

0
santosh