web-dev-qa-db-fra.com

Comment pouvez-vous trier une colonne DataTable donnée et la direction?

J'ai besoin de recourir, en mémoire, à un DataTable basé sur une colonne et une direction provenant d'un GridView. La fonction doit ressembler à ceci:

public static DataTable resort(DataTable dt, string colName, string direction)
{
    DataTable dtOut = null;

    ....
}

J'ai besoin d'aide pour remplir cette fonction. Je pense que je peux utiliser une instruction Select mais je ne sais pas comment. Je ne peux pas cliquer sur Commentaires à cause de ce navigateur, mais vous pouvez me montrer une solution DataTable sur place ou nouvelle, l'une ou l'autre. Pour les personnes me montrant des pointeurs, s'il vous plaît, j'ai besoin d'une fonction codée similaire à celle prototypée.

Que diriez-vous:

// ds.Tables[0].DefaultView.Sort="au_fname DESC";
   public static void Resort(ref DataTable dt, string colName, string direction)
   {
        string sortExpression = string.Format("{0} {1}", colName, direction);
        dt.DefaultView.Sort = sortExpression;
   }
71
Sam Gentile

Je suppose que "direction" est "ASC" ou "DESC" et que dt contient une colonne nommée "colName"

public static DataTable resort(DataTable dt, string colName, string direction)
{
    DataTable dtOut = null;
    dt.DefaultView.Sort = colName + " " + direction;
    dtOut = dt.DefaultView.ToTable();
    return dtOut;
}

OU sans créer dtOut

public static DataTable resort(DataTable dt, string colName, string direction)
{
    dt.DefaultView.Sort = colName + " " + direction;
    dt = dt.DefaultView.ToTable();
    return dt;
}
104
Berkay Turancı

Si vous n’avez qu’un seul DataView, vous pouvez trier à la place:

table.DefaultView.Sort = "columnName asc";

Je ne l'ai pas essayé, mais je suppose que vous pouvez le faire avec n'importe quel nombre de DataViews, à condition de référencer le bon.

66
Alex

En fait, j'ai le même problème. Pour moi a travaillé ce moyen facile:

Ajouter les données à un Datatable et le trier:

dt.DefaultView.Sort = "columnname";
dt = dt.DefaultView.ToTable();
14
Kᴀτᴢ

Les DataTables ont une méthode Select surchargée que vous pouvez faire pour cela. Voir ici: http://msdn.Microsoft.com/en-us/library/way3dy9w.aspx

Mais la valeur de retour de l'appel Select n'est pas un DataTable mais un tableau d'objets RowData. Si vous souhaitez renvoyer un DataTable à partir de votre fonction, vous devrez le construire à partir de rien en fonction de ce tableau de données. Voici un message qui traite et fournit un exemple pour les deux problèmes: http://social.msdn.Microsoft.com/Forums/en-US/winformdatacontrols/thread/157a4a0f-1324-4301 -9725-3def95de2bf2/

7
Paul Sasik

Créez un DataView . Vous ne pouvez pas trier un DataTable directement, mais vous pouvez créer un DataView à partir du DataTable et le trier.

Création: http://msdn.Microsoft.com/en-us/library/hy5b8exc.aspx

Tri: http://msdn.Microsoft.com/en-us/library/13wb36xf.aspx

L'exemple de code suivant crée une vue qui présente tous les produits pour lesquels le nombre d'unités en stock est inférieur ou égal au niveau de réapprovisionnement, trié d'abord par ID de fournisseur, puis par nom de produit.

DataView prodView = new DataView(prodDS.Tables["Products"], "UnitsInStock <= ReorderLevel", "SupplierID, ProductName", DataViewRowState.CurrentRows);

4
Jakub Konecki

Si vous souhaitez trier dans plus d'une direction

  public static void sortOutputTable(ref DataTable output)
        {
            DataView dv = output.DefaultView;
            dv.Sort = "specialCode ASC, otherCode DESC";
            DataTable sortedDT = dv.ToTable();
            output = sortedDT;
        }
2
Evan Parsons