IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

erreur sorting gridview après databinding


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut erreur sorting gridview après databinding
    Bonjour,

    J'ai un dernier problème ( je remercie dvlpz.com qui m'a fortement aidé ),

    J'ai dans mon fichier aspx, un gridview remplit avec un sqldatasource qui fonctionne à merveille (allowsorting="true" et le tri fonctionne bien quand on clique sur l'entete de la colonne du gridview).

    Le problème est si je crée une dropdownlist, qui sert de filtre du gridview, fait un postback dans lequel (dans le code-behind) j'exécute une requête pour re-alimenté le gridview en fonction de la dropdownlist (Au passage le databind fonctionne très bien), alors le tri des colonnes du gridview ne fonctionne plus ( et ceci même sans faire le postback).

    Merci d'avance si vous avez des idées

  2. #2
    Membre émérite Avatar de Ramajb
    Homme Profil pro
    ----------------------------
    Inscrit en
    Septembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ----------------------------

    Informations forums :
    Inscription : Septembre 2007
    Messages : 476
    Par défaut
    Bonjour,
    Quand tu fais un binding a partir d'un DataSourceID, le Gridview gère le tri automatiquement, mais derrière il sait toujours la valeur du SortExpression et du SortDirection utilisé pour le mecanisme de tri. Cette fonctionnalité est perdue une fois qu'on fait le databind en code behind. Ce qui fait que on est obligé de gérer ces deux éléments manuellement. Une idée c'est de les stockée chacun dans une variable persistante afin de pouvoir les comparer avec les nouveaux valeurs et suite au comparaison qu'on doit décider si on doit faire le tri ou pas.

    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    D'accord mais concrètement que faut il rajouter et où?

  4. #4
    Membre chevronné Avatar de Pilru
    Homme Profil pro
    Dev ASP.NET/jQuery ; Admin ORACLE
    Inscrit en
    Septembre 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev ASP.NET/jQuery ; Admin ORACLE

    Informations forums :
    Inscription : Septembre 2007
    Messages : 491
    Par défaut
    Pourquoi faire une requête en code behind ?
    Tu peux déclarer un selectparameter "brancher" sur la ddl et qui récupère automatiquemet la valeur sélectionnée :

    Exemple simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <asp:SqlDataSource runat="server">
        <SelectParameters>
            <asp:ControlParameter ControlID="maDDL" PropertyName="SelectedValue" />
        </SelectParameters> 
        </asp:SqlDataSource>
    Doc MS : Using Parameters with Data Source Controls

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 187
    Par défaut
    Bonjour,

    Tu peut gérer tous ça juste en code ASpx, pour la source de donnée tu fait un where sur Id du controle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <asp:SqlDataSource ID="DossierSource" runat="server" 
                ConnectionString="<%$ ConnectionStrings:basedossierConnectionString %>" 
     
                SelectCommand="SELECT * FROM [dossier] WHERE ([num_dossier] = @num_dossier)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DossList" Name="num_dossier" 
                        PropertyName="SelectedValue" Type="String" />
                </SelectParameters>
            </asp:SqlDataSource>
    Avec le num_dossier est sélectionné dans DDList.

  6. #6
    Membre émérite Avatar de Ramajb
    Homme Profil pro
    ----------------------------
    Inscrit en
    Septembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ----------------------------

    Informations forums :
    Inscription : Septembre 2007
    Messages : 476
    Par défaut
    Citation Envoyé par quake3 Voir le message
    D'accord mais concrètement que faut il rajouter et où?
    Dans le code behind, tu définit deux propriétés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    protected string SortExpression
            {
                get { return (string)ViewState["SortExpression"]; }
                set { ViewState["SortExpression"] = value; }
            }
     
            protected SortDirection SortDirection
            {
                get 
                {
                    if(null == ViewState["SortDirection"])
                        return SortExpression.Ascending;
                    else
                        return (SortExpression)ViewState["SortDirection"];
            }
    Ces deux proprietes vont contenir chacun le nom de colonne sélectionné et le type de tri (ASC ou DESC) effectuée la dernière fois.
    Ensuite, tu fais appel à ces elements dans l'evenement OnSorting de ton grid:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        //e.SortExpression permet d'avoir le nom de colonne qui vient d’être cliqué
        if(e.SortExpression == this.SortExpression)
       {
          //tri va se faire sur la même colonne que précédente.
          //donc forcement si le tri précédent est ASC alors l'utilisateur a cliqué     //pour avoir un tri DESC et vis versa
          this.SortDirection = this.SortDirection==SortDirection.Ascending? SortDirection.Descending: SortDirection.Ascending;
       }
       else
       {
          //ici, colonne différente du précédente
          this.SortDirection = SortDirection.Ascending;
       }
     
        //on sauvegarde toujours le nom du colonne pour être compare lors du //prochain postback (tri)
       this.SortExpression == e.SortExpression;
     
       //Ici tu fais un rafraîchissement de ton gridview i.e faire une nouvelle //requête en tenant compte du nouvelle valeur de chaque propriété définit //dessus.  En gros on essaie de construire la clause Order by du requête select
       string clauseOrderBy="";
       swith(this.SortExpression)
       {
           case "PremierColonne" : clauseOrderBy= this.SortDirection==SortDirection.Ascending? "ORDER BY PremierColonne ASC":"ORDER BY PremierColonne DESC";
          //de meme pour les autres colonnes                   
     
        }
     
       //ici tu dois avoir la requête select complète afin de pouvoir requeter de nouveau vers la base et binder ton gridview après.
     
    }
    Une autre alternative le plus simple c'est d'utiliser un ControlParameter pour le SelectParameters de ton SqlDataSource comme dis ci-dessus. Mais il arrive parfois où on a besoin de le faire en code behind, le besoin oblige. Donc tu as le choix
    N’hésites pas si tu as des questions.

  7. #7
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Citation Envoyé par javalhoussain Voir le message
    Bonjour,

    Tu peut gérer tous ça juste en code ASpx, pour la source de donnée tu fait un where sur Id du controle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <asp:SqlDataSource ID="DossierSource" runat="server" 
                ConnectionString="<%$ ConnectionStrings:basedossierConnectionString %>" 
     
                SelectCommand="SELECT * FROM [dossier] WHERE ([num_dossier] = @num_dossier)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DossList" Name="num_dossier" 
                        PropertyName="SelectedValue" Type="String" />
                </SelectParameters>
            </asp:SqlDataSource>
    Avec le num_dossier est sélectionné dans DDList.
    Le jour où tu décides de remplacer aspx par silverlight, tu refais tout ? Il est plus propre de faire une application avec des couches, dont une DAL qui te fait les accès aux données et te retourne des objets (par exemple) qui sont mannipulés par les autres couches et qui sont affichés dans l'ihm...
    PAS D'ACCES AUX DONNEES NI DE METIER DANS LA COUCHE DE PRESENTATION... ensuite, si vous avez opté pour une application monocouche, alors priez pour ne jamais avoir à changer votre couche de présentation... sinon, vous refaite tout.

    ps le code behind, c'est aussi de la couche de présentation, il ne devrait que permettre de "faire de l'interface" et d'APPELER des traitements de la couche métier. que tu y code la façon de trier ton composant, c'est logique : c'est de la présentation...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Désolé pour le temps de réponse,
    j'ai réussi avec le selectparameter et ca fonctionne nickel, le seul problème est que j'ai rajouter une valeur "TOUS" dans ma dropdownlist et je ne veux pas qu'elle change la requête lorsque "TOUS" est sélectionnée.

    WHERE FONCTION = "TOUS"
    => ne renverra jamais rien

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/02/2008, 14h55
  2. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  3. Erreur de OutputTo après annulation de copier
    Par uloaccess dans le forum Access
    Réponses: 2
    Dernier message: 30/11/2005, 13h16
  4. Réponses: 2
    Dernier message: 02/11/2005, 21h23
  5. Erreur validation fichier après un OpenDialog
    Par jackrabbit dans le forum Langage
    Réponses: 2
    Dernier message: 24/08/2005, 13h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo