GridView et "évènement Sorting" [Résolu]

Signaler
Messages postés
27
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
3 janvier 2008
-
Messages postés
11
Date d'inscription
mardi 24 février 2004
Statut
Membre
Dernière intervention
21 novembre 2007
-
Bonjour,

j'ai un Gridview avec tri (AllowSorting="True") bindé à un SqlDataSource. Le tri s'effectue correctement sur les colonnes.
Pour faire une recherche sur les données qui y sont affichées sur un clik bouton, je crée un nouveau SqlDataDource en code behind faisant la requête de recherche.

SqlDataSource sds = new SqlDataSource();
....
MyGridView.DataSource = sds;
MyGridView.dataBind();
...

Le Gridview affiche bien les données voulues.
Le problème vient lorque j'essaye de faire un tri sur une colonne du GridView "fraichement bindé", j'ai une erreur :

"Le GridView "MyGridView" a déclenché un évènement Sorting qui n'était pas géré"  

???
J'ai bien essayé de forcer en code-behind  après le databind() :

MyGridView.AllowSorting = true;
MyGridView.Columns[0].SortExpression = "ITV_SN";

mais rien y fait.

Que faire ??

Merci d'avance.

11 réponses

Messages postés
79
Date d'inscription
lundi 28 octobre 2002
Statut
Membre
Dernière intervention
21 octobre 2008

Personnellement pour un affichage d'une recherche  avancée dans un Gridview, j'ai créé ma requête "reqRecherche" que j'envois ensuite dans la data source.

SqlDataSourcePersonne.SelectCommand = reqRecherche
hdnReqRecherche.value = reqRecherche
SqlDataSourcePersonne.DataBind()
GridViewPersonne.DataBind()

mais pour que le tri fonctionne il faut réinjecté la requête dans le prerender du Gridview (ou de la page) :






If
hdnReqRecherche.Value <>

""



Then

   SqlDataSourcePersonne.SelectCommand = hdnReqRecherche.Value
   SqlDataSourcePersonne.DataBind()


End



If

GridViewPersonne.DataBind()



C'est pour cette raison que je stock la requête dans Hiddenfield.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
pourquoi ne pas utiliser le meme sqldatasource en rajouter un controlparameter associé à la textbox de recherche ?

le code que donne gldfdp permet seulement de s'abonner à l'event sorting du gridview mais tu n'en as pas besoin si tu le bind en utilisant le sqldatasource. C'est utile si tu le bind "à l'ancienne" (je bind toujours à l'ancienne, je trouve les XXXDatasource stupide).

<hr />Cyril - MSP - MCTS ASP.net & SQL
Messages postés
90
Date d'inscription
lundi 30 juin 2003
Statut
Membre
Dernière intervention
21 février 2008

MyGridView.Sorting+=




new



GridViewSortEventHandler
(MyGridView_Sorting); Si tu as défni une fonction de tri. Cela si tu bind en code-behind.
Messages postés
27
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
3 janvier 2008

merci de ta réponse ..mais ça marche pas.
Toujours le même message d'erreur.
J'ai essayé avant et après le databind() mais je ne suis pas sûr que ca soit au bon endroit (j'ai toujours pas vraiment bien compris la chronologie des évènements d'ASP.NET quand il reconstruit sa page)
De plus, il me faut redéfinir la foncton de tri;  n'y a t_il pas moyen d'utiliser directement la méthode de tri du GridView ?
Messages postés
27
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
3 janvier 2008

merci à vous deux pour vos réponses.
Je pense que je vais opter pour la solution de zuff.
Cyril : qu'appelles tu bindé à l'ancienne ? (nouveau dans ASP, j'ai commencé directement en ASP.NET 2.0 en essayant de suivre la 'logique' de dev Microsoft, celle des vidéos sur leur site, c'est à dire en utilisant un maximum leurs composants. Mais c'est vrai qu'il me semble que par moment, dès qu'on sort de leur utilisation standard, ça complique plus qu'autre chose)
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
zuff : tu stock la requete dans un hiddenfield ??? :| ben t'es gentil avec ton utilisateur toi ! en faisant ca tu lui laisses le full control de la base ... il peut afficher les requetes qu'il veut. J'espere que tu stockes pas des cartes de crédits ou des infos confidentiels ... en plus j'ai l'impression que ta solution fait 2 requete SQL :s

pour ce qui est du binding à l'ancienne : c'est lorsque l'on fait
monGridview.datasource = macoucheserver.GetDatas(filterValue);
monGridview.DataBind();

et qu'on utilise pas les controles DataSource ...

mais dans ton cas, si tu utilises un sqldatasource je te conseil de rajouté une propriété controlparameter qui est lié à ta textbox. tu n'auras absolument rien à écrire dans le code-behind. Ce qui peut etre utile pour des petits sites ou lorsque tu n'as pas une application bien architecturé en plusieurs couches.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL
Messages postés
90
Date d'inscription
lundi 30 juin 2003
Statut
Membre
Dernière intervention
21 février 2008

Pour les applications structurées en plusieurs couches utilise une objectdatasource ça marche très bien.
Messages postés
79
Date d'inscription
lundi 28 octobre 2002
Statut
Membre
Dernière intervention
21 octobre 2008

jesusonline: j'utilise hiddenfield en visible= false, l'utilisateur ne vois rien et tu as une variable de page qui existait en 1.1 et disparue sur la 2. (le hiddenfield est moins problèmatique qu'une variable de session )
Messages postés
11
Date d'inscription
mardi 24 février 2004
Statut
Membre
Dernière intervention
21 novembre 2007

Tout d'abord merci pour les réponses, elle m'ont bien aidé.
zuff  : au sujet de ta reqRecherche, comment la définit-tu ? en tant que string ? Comment passes-tu en paramètre une valeur d'un textbox par exemple ? :$
En fait je ne vois pas où passer en paramètre l'argument à rechercher ^_^'

Merci d'avance.
Messages postés
79
Date d'inscription
lundi 28 octobre 2002
Statut
Membre
Dernière intervention
21 octobre 2008

reqRecherche est bien sur une string.

Protected
Sub btnRechercheAvancee_Click(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles btnRechercheAvancee.Click

' recherche avancée

Dim

reqRecherche AsString = "SELECT champ1, champ2 FROM table1" 

IftxtRecherche.Text.Trim.Length> 2
Then
   reqRecherche += " WHERE champ1 LIKE '%"& txtRecherche.Text.Trim.Replace("'"
,
"`")
&"%'"
EndIf

reqRecherche += reqRecherche &

" ORDER BY champ1"

hdnReqRecherche.value = reqRecherche

Cette technique est pour faire des recherches sur plusieurs critères (la création de la requête est un peu plus complexe que dans l'exemple), si tu doit faire des recherches que sur un critère, il suffit d'utiliser  les propiétés du SqlDataSource.
Messages postés
11
Date d'inscription
mardi 24 février 2004
Statut
Membre
Dernière intervention
21 novembre 2007

Merciiii, mais j'ai trouvé ma solution en C#, en ce qui concerne le multi-critères, j'ai trouvé mon bonheur en utilisant un StringBuilder et sa méthode Append().