2008-12-24 7 views
0

J'ai un DataBound GridView. Cependant j'ai une colonne où la valeur provient d'un calcul dans le code derrière - elle est montrée dans un TemplateField.Tri ASP.NET GridView sur un champ calculé

Comment trier ma grille en fonction de cette valeur calculée?

Répondre

7

Placez vos données initiales retournées dans un DATASET ou un DATATABLE. Ajoutez au DATATABLE une nouvelle colonne pour votre champ calculé. Marcher ces données en faisant le calcul nécessaire, et en mettant le résultat dans le champ calculé.

Créer une nouvelle vue basée sur la datatable et trier la vue par le champ calculé. Liez la grille à la vue de données.

Dim DT as DataTable 
DT = GetDataTableFromDataBaseMethod() 
DT.Columns.Add(New DataColumn("CalculatedColumnName")) 
For each row as DataRow in DT.Rows 
    row("CalculatedColumnName") = PerformCalculations(row) 
Next 

Dim view as New DataView 
view.DataTable =dt 
View.Sort = "CalculatedColumnName DESC" 

datagrid1.Datasource = view 
datagrid1.Databind 

Ou, si possible, effectuer le calcul dans l'instruction SQL, re:

SELECT Col1, Col2, Col3, Col1+Col2+Col3 AS LineTotal FROM Table; 
+0

Je l'ai mis dans la requête select - merci –

+0

Il y a une autre façon de le faire. Vous pouvez ajouter la colonne à DataTable comme correctement suggéré par @Stephen, mais si vous avez besoin de calculer la nouvelle colonne comme une expression en utilisant d'autres colonnes du 'DataTable', vous n'avez pas besoin de parcourir toutes les lignes. Vous pouvez simplement utiliser 'DataTable dt = GetDataTableFromDataBaseMethod();' puis, par exemple, 'dt.Columns.Add (" CalculatedColumnName ", typeof (double)," (FirstValueColumn - SecondValueColumn) * ThirdValueColumn ");'. Cela peut être très utile si vous ne pouvez pas ajouter directement votre expression dans la requête, ce qui est toujours le meilleur choix. –

0

Une solution possible serait de remplir un datatable au lieu de lier la grille. Utilisez ensuite une vue de données avec l'ensemble de tri de votre colonne calculée et liez-la à la grille dans le code qui suit.

0

Une autre solution consiste à considérer est l'ajout de colonne calculée à la table de base de données elle-même. Cela a l'avantage de renvoyer la colonne calculée dans la même expression SQL qui charge le reste de la ligne, mais nécessite malheureusement de modifier le schéma de la base de données.

+0

Oui, je le fais dans les endroits où il vaut la peine de persister les données - mais c'était dans un endroit spécifique et je ne voulais pas changer le schéma –

0

Notez que l'ajout d'une colonne au datatable marquera toutes les lignes comme mises à jour, donc lors de la sauvegarde dans la base de données, il essaiera de mettre à jour tous les enregistrements.

Questions connexes