Comment faire pour trier les colonnes dans un ASP.NET GridView si vous utilisez une source de données personnalisée?
Je ne peux pas obtenir mon GridView pour permettre à l'utilisateur de trier une colonne de données quand je suis en utilisant une mesure SqlDataSource.
J'ai un GridView dans lequel le code de l'ASP référence dans le code HTML est minime:
<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>
Dans le code-behind-je joindre un créé dynamiquement SqlDataSource (les colonnes qu'il contient ne sont pas toujours les mêmes, de sorte que le SQL utilisé pour créer il est construit à l'exécution). Par exemple:
- Je configurer les colonnes...
BoundField column = new BoundField();
column.DataField = columnName;
column.HeaderText = "Heading";
column.SortExpression = columnName;
grid.Columns.Add(column);
la source de données...
SqlDataSource dataSource = new SqlDataSource(
"System.Data.SqlClient",
connectionString,
generatedSelectCommand);
puis le gridview...
grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();
Pour le moment rien ne se passe lorsqu'un utilisateur clique sur un en-tête de colonne lorsque je m'attends à faire le tri entre les données de la colonne. Quiconque les idées de ce que je suis absent?
Si il y a une jolie manière de faire qui serait aussi utile que cela puisse sembler malpropre pour moi!
OriginalL'auteur Ben L | 2008-09-26
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord ajouter un événement:
Alors que l'événement ressemble:
En gros, vous devez récupérer vos données à nouveau.
Vous avez raison, il semble désordonné et il ya une meilleure façon: ASP.Net MVC
Malheureusement c'est un de totalement différent modèle de page.
OriginalL'auteur Keith
Vous pourriez tout aussi bien réaffecter la source de données.SelectCommand avant la DataBind() dans le gestionnaire de Tri. Quelque chose comme ceci:
J'espère que cette aide. Laissez-moi savoir si vous avez besoin d'aide supplémentaire pour la mettre en œuvre.
Profitez-en!
OriginalL'auteur Mike
Je ne suis pas sûr à ce sujet, mais si vous utilisez un standard SqlDataSource et que vous cliquez sur un champ de tri en fonction de ce champ, le SqlDataSource est rempli à nouveau avec les données et c'est le rebond de la grille. De sorte que le tri ne se fait pas sur le côté client et peut également être effectué seulement lorsque la selectmethod de la SQLDataSource n'est pas DataReader.
Lors de la manipulation de la tri événement, avez-vous recréer le SqlDataSource et de rebond pour le contrôle GridView? Pouvez-vous mettre le champ de tri et d'orientation à la generatedSelectCommand, que vous utilisez? Ou de le mettre à l'SortParameterName propriété de la SQLDataSource?
Je suis absolument sûr que vous avez un rebond de la SqlDataSource à la grille, et puisque vous le créer à la volée, vous devez remplir à nouveau.
Vous devez gérer l'événement comme Keith mentionné. Avec un standard de contrôle SqlDataSource c'est fait automatiquement, mais dans ce cas, vous devez également prendre soin de vous-même.
OriginalL'auteur Biri
Mieux vaut tard que jamais?
Certains plus de Keith suggestion qui est fondamentalement celui de droite.
Vérité, c'est que vous avez à traiter avec tri sur gridView_Sorting événement.
Il n'est pas nécessaire de DataBind() le contrôle GridView plus tôt, par exemple dans l'événement Page_Load. Là vous devez seulement appeler les GridView.Méthode sort() au lieu de .DataBind(). Voici comment ça se passe:
Prochaine, nous allons avoir un regard sur gridView_Sorting événement.
Il vous suffit de pousser la source de données pour le droit de tri. GridView lui-même ne pas le gérer (dans ce cas au moins).
Pas besoin de code toute fonctionnalité de tri à la source de données à la transmission de paramètres de tri à la procédure stockée. Tous les tri prend place au-dessus des morceaux de code.
En outre, il est bon d'avoir le contrôle gridView.EnableViewState passé à False, ce qui provoque la page pour être beaucoup plus léger pour le trafic réseau et pour le navigateur. Peut faire tant que la grille est entièrement recréé à chaque fois que la page est post de retour.
Have a nice day!
Martin
OriginalL'auteur Martin