2009-08-14 6 views
4

Im using entity framework 1.0 et essayant de fournir un Gridview avec un objectdatasource qui a accès à ma façade. Le problème, c'est qu'il semble particulièrement difficile et n'a rien vu qui fasse vraiment ce que je veux qu'il fasse sur internet.Objectdatasource et Gridview: tri, pagination, filtrage

Pour ceux qui le savent, une vue de grille alimentée par un objectdatasource, il ne peut pas trier automatiquement, alors vous devez le faire manuellement. C'est pas si mal. Là où cela devient un cauchemar, c'est quand nous ajoutons des paramètres de pagination et de filtre à la source de données d'un gridview.

Après de nombreuses heures à la recherche sur Internet, je vous demande, les gars, si quelqu'un sait un lien qui peut me expliquer comment mélanger Pagging, tri et filtrage pour un gridview et un ObjectDataSource!

Merci d'avance et désolé pour mon anglais.

Répondre

5

Il peut ne plus être d'intérêt pour vous, mais je pensais que je posterai une réponse quand même:

J'utilise Linq2Sql et un ObjectDataSource et il ne Pagination et tri très bien. J'ai implémenté une classe à utiliser comme objet ObjectDataSource. Il a une méthode Select et un Count appelant ma couche de gestion qui utilise Linq2SQL requêtes pour récupérer des données de la base de données, devrait être similaire à EntityFramework. Les méthodes select obtiennent automatiquement l'index du premier élément, la taille de la page et l'expression de tri en tant que paramètres.

public List<EntityClass> Select(int startIndex, int pageSize, string sortBy) {} 
public int Count() {} 

Dans le ASPX, le DataSource est configuré comme ceci:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="Select" EnablePaging="true" 
    StartRowIndexParameterName="startIndex" 
    MaximumRowsParameterName="pageSize" 
    SortParameterName="sortBy" SelectCountMethod="Count" > 
</asp:ObjectDataSource> 

Le Select et la méthode de comptage utiliser des requêtes LINQ pour récupérer les données de la DB. J'utilise les méthodes Skip(), Take() et Orderby(). Pour l'OrderBy d'accepter une expression de tri de chaîne j'utilise DynamicLinq Il n'y a pas grand chose à coder, la liaison de données, la pagination et le tri fonctionnent automatiquement.

Si vous êtes intéressé, je pourrais poster plus de détails sur mon code.

+0

Oui, c'est dans cette direction que nous avons décidé d'aller. Mais, j'étais intéressé de savoir s'il y avait un moyen de faire quelque chose comme une source de données SQL avec ce que nous n'avons pas à faire. Mon, je ne sais pas comment dire mais mon "programmeur en chef" l'a trouvé Entité 4 dans Studio 2010 LLBL Gen qui est très puissant, et le tri, la pagination et l'interrogation sont beaucoup plus efficaces et prennent beaucoup moins de ressources et comprennent un puissant tri/pagination méthodes qui interagissent avec la base de données AVANT de retourner toutes les données. Mais merci Peter! Peut-être devrais-je montrer une requête quand on va l'avoir complètement implémentée! –

0

Je sais que c'est une vieille question, mais voici comment je gère cela. Ajouter une ObjectDataSource à ma page aspx:

<asp:ObjectDataSource ID="myDataSource" runat="server" 
    SelectMethod="GetSearchResults" EnablePaging="true" 
    StartRowIndexParameterName="startIndex" 
    MaximumRowsParameterName="pageSize" 
    SortParameterName="sortBy" SelectCountMethod="GetSearchCount" > 
</asp:ObjectDataSource> 

Notez qu'il manque un type?J'installe que dans le code, sur mon Page_Load

myDataSource.TypeName = this.GetType().AssemblyQualifiedName; 

Ensuite, je suis en utilisant des méthodes statiques sur la même page (dans la même classe) de mettre à jour le gridview:

public static int GetSearchCount() 
{ 
    return _RowCount;//set elsewhere in code - this is the total number of rows for the query 
} 

public static DataTable GetSearchResults(string sortBy, int pageSize, int startIndex) 
{ 
    //Code to dynamically generate SQL statements based on supplied parameters 
    //then return a datatable containing only the data to be shown in the gridview 
}