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 :

GridView problème suite au tri


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut GridView problème suite au tri
    Bonjour à tous,

    Après de nombreuses recherches sur le net et sur ce forum, je n'ai pu trouver de réponses à mon problème, c'est pour cette raison que je post aujourd'hui.

    Je me sert actuellement de asp.Net et c# afin de réaliser une interface graphique qui me permet d'afficher le contenu de tables SQL via une interface web.

    En gros j'ai une dropDownList qui contient le nom de toutes les tables de ma base de données et lorsque j'en sélectionne une, je crée ma selectCommand pour ma sqlDataSource. Celle-ci est attachée à une dataGridView dont les propriétés allowPaging et allowSorting sont à "true".

    De ce coté là il n'y a aucun souci.
    Le problème est que lorsque je trie une colonne puis par la suite je change de table sélectionnée via la dropDownList, j'ai l'erreur suivante.

    [IndexOutOfRangeException: Cannot find column Source.]
    System.Data.DataTable.ParseSortString(String sortString) +4827166
    System.Data.DataView.CheckSort(String sort) +32
    System.Data.DataView.set_Sort(String value) +128
    System.Web.UI.WebControls.FilteredDataSetHelper.CreateFilteredDataView(DataTable table, String sortExpression, String filterExpression, IDictionary filterParameters) +94
    System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1610
    System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +19
    System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142
    System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73
    System.Web.UI.WebControls.GridView.DataBind() +4
    System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
    System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22
    System.Web.UI.WebControls.GridView.OnPreRender(EventArgs e) +17
    System.Web.UI.Control.PreRenderRecursiveInternal() +80
    System.Web.UI.Control.PreRenderRecursiveInternal() +171
    System.Web.UI.Control.PreRenderRecursiveInternal() +171
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842
    Je ne sais pas quoi faire car il me semble avoir tout essayé sans résultat.
    Ainsi j'ai essayé de faire un databind de ma gridView à différents moments, j'ai détruit la sortExpression....
    On dirait que l'action de trie sur la colonne est gardée en "mémoire" et que le gridView n'est pas actualisé.
    Je précise que les colonnes sont générées automatiquement.

    Si vous avez des suggestions, pistes conseils, solutions .... je suis preneur.
    Merci d'avance

    A+
    Knarfoo

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Par défaut
    Plusieurs questions:

    Tu peux poster ton code?
    Ta grid affiche bien les infos quelle que soit la première table sélectionnée dans la DDL?
    Sais-tu qu'il y a un forum ASP.NET où ta question aurait plus sa place et trouverait d'avantage de réponses?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Bonjour papouuu,

    Tout d'abord merci pour ton aide.
    Je ne sais pas si le code sera utile vu qu'il n'y a rien de complexe et que toutes les fonctions de bases fonctionnent.

    Ici l'asp.NET:
    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
            <asp:DropDownList ID="TableNameDropDownList" runat="server" AutoPostBack="True" 
                DataSourceID="DropDownTableListSqlDataSource" DataTextField="name" 
                DataValueField="name" 
                onselectedindexchanged="TableNameDropDownList_SelectedIndexChanged">
            </asp:DropDownList>
     
           <asp:SqlDataSource ID="DropDownTableListSqlDataSource" runat="server" 
                ConnectionString="<%$ ConnectionStrings:nomDeLaConnec %>" 
                ProviderName="<%$ ConnectionStrings:nomDeLaConnec .ProviderName %>" 
                SelectCommand="SELECT name FROM sysobjects WHERE type='U'  ORDER BY name ASC">
            </asp:SqlDataSource>
            <asp:GridView ID="GrilleTest" runat="server" AllowPaging="True" 
                AllowSorting="True" BorderColor="White" BorderStyle="None" CellPadding="5" 
                DataSourceID="SqlDataSource1" GridLines="Vertical" 
                onpageindexchanging="GrilleTest_PageIndexChanging" 
                onsorting="GrilleTest_Sorting" PageSize="15">
                <AlternatingRowStyle BackColor="#AEBEBE" />
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:nomDeLaConnec %>" 
                ProviderName="<%$ ConnectionStrings:nomDeLaConnec .ProviderName %>">
            </asp:SqlDataSource>
    Le code behind ne servant qu'à la construction de la selectCommande.

    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
        protected void TableNameDropDownList_SelectedIndexChanged(object sender, EventArgs e)
        {
     
            try
            {
                if (!Session["currentRequest"].Equals(null))
                {
                    Session["previousRequest"] = Session["currentRequest"].ToString();
                }
            }
            catch (NullReferenceException e1) {}
     
            String selectReq = "SELECT * FROM " + TableNameDropDownList.SelectedValue;
            Session["currentRequest"] = selectReq;
     
            try
            {
                if (!(Session["currentRequest"].ToString()).Equals(Session["previousRequest"].ToString()))
                {
                    SqlDataSource1.SelectCommand = selectReq;
                    SqlDataSource1.DataBind();
                }
            }
            catch(NullReferenceException e2)
            {
                SqlDataSource1.SelectCommand = selectReq;
                SqlDataSource1.DataBind();
            }
        }
    Ma gridView affiche bien les informations quelque soit la première table sélectionnée dans la DDL.
    Je peux d'ailleurs parfaitement "naviguer" entre les différentes tables jusqu'à ce que je procède à un tri sur l'une des colonnes.
    J'hésitais à poster ici ou sur la partie ASP.NET étant donné que le code behind est du c#et que je ne sais pas vraiment si le problème est lié à l'asp.Net ou au c#.

    A+
    Knarfoo

  4. #4
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    salut

    dans ton code behind, je mettrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
     if (!(Session["currentRequest"].ToString()).Equals(Session["previousRequest"].ToString()))
                {
                    SqlDataSource1.SelectCommand = selectReq;
                    SqlDataSource1.DataBind();
                    GrilleTest.databind();
                }
    pour regénérer le gridView et recréer les colonnes.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Salut bizet,

    Merci pour ton aide, j'avais effectivement pensé au databind() que j'ai testé dans plusieurs événements comme le page_load, pre-render, ou encore là où tu me l'a conseillé mais rien ne change il me sort là même erreur.
    Apparemment il essaye de faire une opération sur la sortExpression de la dataGridView qui n'a pas était correctement rafraichit, ce que je ne comprend pas étant donné que s'il recréer automatiquement les colonne à partir de la nouvelle selectCommande la sortExpression devrait être vide ou mise à jour ....

    A+
    Knarfoo

  6. #6
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Salut.

    De souvenir si le sortExpression n'est pas défini il prend le nom de l'attribut de la classe qui est bindé.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Salut,

    Le sortExpression doit être généré automatiquement car le gridView gère le tri avec allowSorting = true ainsi que les colonnes qui sont générées automatiquement.
    Ce que je ne comprend pas, c'est qu'on dirait que le sortExpression est gardé en mémoire et que lorsque je change de table SQL (dans la DDL) à afficher (dans le gridView) il garde le sortExpression dont il s'est servi lors du tri sur une colonne de la table précédente.
    Du moins c'est la fin du message d'erreur qui me fait penser cela.

    [IndexOutOfRangeException: Cannot find column Source.]
    System.Data.DataTable.ParseSortString(String sortString) +4827166
    System.Data.DataView.CheckSort(String sort) +32
    System.Data.DataView.set_Sort(String value) +128

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    il y a quoi dans cet évenement GrilleTest_Sorting?

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Salut rattlehead,

    Je remet juste la selectCommande à la data source sinon le tri ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        protected void GrilleTest_Sorting(object sender, GridViewSortEventArgs e)
        {
            SqlDataSource1.SelectCommand = Session["currentRequest"].ToString();
            SqlDataSource1.DataBind();
        }
    Merci pour ton aide
    A+

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    en fait j'ai l'impression que tout est dans le message d'erreur.
    tu as précisé sur quel champ tu ordonnais?

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Salut rattlehead,

    Pourrais-tu détailler un peu plus ta pensée stp car je débute en Asp.Net et je ne vois pas trop de quoi tu parles.

    Merci d'avance.

  12. #12
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    il doit faire un sort sur un champ et je crois que tu ne lui fournis pas l'info. tu dois l'avoir dans les propriétés du gridview.
    sinon lis ce truc
    http://msdn.microsoft.com/en-us/library/hwf94875.aspx

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    En fait tout est configuré en "auto".
    Donc ce n'est pas moi qui renseigne la sortExpression.

    Mes colonnes sont générées automatiquement, le tri et la pagination il en est de même.
    Ce que je ne comprend pas, c'est que lorsque je tri une colonne, il affecte le nom de cette colonne à la sortExpression, mais lorsque je change de table via la DDL, il conserve l'ancienne valeur dans la sort expression !
    Et c'est ça qui fait planter. Or cette sortExpression n'a qu'un Get, je ne peux pas faire GridView.sortExpression = "";

    Si quelqu' un connait un moyen de remédier à ça ?

    EDIT : Si je sélectionne une nouvelle table contenant une colonne du même nom que celle que je viens de trier, ça marche. Donc le problème viens bien de la sortExpression.

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    J'ai enfin trouvé une solution !

    La sortExpression étant en read only, la seul possibilité que j'ai trouvé pour pouvoir la modifier est de se servir de la fonction "sort" du gridView afin d'affecter une sortExpression par défaut qui permet de remplacer celle utilisée précédemment.
    J'ai personnellement choisi de la mettre à "null" car je n'ai aucun nom de colonne récurent dans toutes mes tables SQL.

    Ci-dessous la ligne de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GrilleTest.Sort(null, SortDirection.Ascending);
    Merci à tous pour votre aide dans la recherche de cette solution.

    A+
    Knarfoo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] GridView : Problème d'affichage d'indicateur de tri lorsque changement de page
    Par sylvebarbe78 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 22/02/2013, 12h34
  2. Problème dans le tri de gridView
    Par sky88 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 23/08/2011, 16h43
  3. Problème suite à différents tris
    Par Jojo66 dans le forum Excel
    Réponses: 8
    Dernier message: 04/07/2011, 17h43
  4. problème suite à un appuie long de la touche shift
    Par emi dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 02/04/2006, 14h32
  5. Problème dans un tri de tableau
    Par pmboutteau dans le forum ASP
    Réponses: 5
    Dernier message: 29/11/2005, 13h12

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