none
Pagination GridView Code Behind RRS feed

  • Question

  • Bonjour,

    Je fait un mapping de données en code behind (ce qui n'est pas pratique car pagination et le tri doivent etre recodé)!

    et donc maintenant j'ai un problème avec ma pagination!

    Voici mon code :

    Extrait de code

    protected void gvResultat_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this._sds.SelectCommand += this.Where + this.OrderBy;//mon selectCommand est préinitialisé, je rajoute juste mes clauses where et order by
            this.gvResultat.PageIndex = e.NewPageIndex;
            this.gvResultat.DataSource = this._sds;
            this.gvResultat.DataBind();
        }



    Le problème est que lorsque je change de page, jai toujours les mêmes éléments qui sont affichés.

    des suggestions?

    merki Big Smile


    mercredi 9 janvier 2008 13:14

Réponses

  • Bonjour,

    Je pense que votre première solution est la plus propre par contre pour le RowDataBound, avez vous vérifié si vous pouvez obtenir vos données directement à partir de ((DataRowView) e.Row.DataItem).Row ? Voir si e.Row.DataItemIndex ne contient pas déjà l'index correct ?

    Si les données ne sont pas correct, votre solution me parait la meilleur si vous ne pouvez vraiment pas utiliser le mapping direct des SqlDataSource.

     

    Guillaume

    lundi 14 janvier 2008 16:55
  • Voila la syntax (si j'ai bien compris cette fois  ):

     

    Extrait de code

    protected void Page_Load(object sender, EventArgs e)

    {

    this._sds.Selected += new SqlDataSourceStatusEventHandler(DataSourceSelectedHandler);

    }

     

    void DataSourceSelectedHandler(object sender, SqlDataSourceStatusEventArgs e)

    {

    this.lblNbDemande.Text = e.AffectedRows.ToString() + " demandes trouvées.";

    }

     

     

    Guillaume
    mardi 22 janvier 2008 11:08

Toutes les réponses

  • Bonjour,

    Si vous ne voulez récupérer que les données spécifiques à la page courante et utiliser le "paginateur" du GridView, vous ne pourrez le faire qu'avec un ObjectDataSource car celui-ci sépare la récupération des données de nombre d'élément totaux qui permet au GridView de créer les propriétés du pager (PageCount notamment). Avec tout autre source de données je n'ai pas trouvé d'autre solution que de lui fournir à chaque fois l'ensemble des données car la propriété VirtualRecordCount du DataGrid n'existe pas sur le GridView

    Pour utiliser un ObjectDataSource, vous trouverez un exemple sur la msdn : http://msdn2.microsoft.com/en-us/library/aa479347.aspx

    L'astuce si vous ne voulez pas créer d'objet métier est que la méthode que vous spécifiez pour la propriété SelectMethod renvoi une DataTable.

     

    Guillaume

    mercredi 9 janvier 2008 14:17
  • Actuellement j'ai tester avec mon SqlDataSource sds.DataSourceMode=SqlDataSourceMode.Dataset;

    le probème est que les données que j'ai chargé a l'aide de la méthode RowDataBound (ItemTemplate) sont ceux de la page 1, le reste des données chargées grçace aux BoundFied sont correcte!

    Je vais essayer avec l'ObjectDataSource, en changeant tous ce que j'ai deja fait avec le SqlDataSource

    mercredi 9 janvier 2008 14:51
  • Bonjour,

    désolé ne ne pas avoir donner de réponses plus tot, j'etais occupé sur d'autres developpement(vous l'avez surement vu ^^)

    donc voila ma question:
    j'ai regardé votre lien, et fait quelques recherche!
    J'ai vu que si je voulais mettre des paramètres dans ma requete de ma méthode (celle du selectMethod) il suffisait de faire :

    Extrait de code

    <asp:ObjectDataSource id="BookSource" Runat="Server"
    TypeName="BookInfo"
    SelectMethod="Get_Books">
    <SelectParameters>
    <asp:ControlParameter
    Name="BookType"
    ControlID="TypeList"
    PropertyName="SelectedValue"/>
    </SelectParameters>

    </asp:ObjectDataSource>

    J'aimerai savoir s'il y a possibilité de rendre ne paramètre non obligatoire?
    Car j'aurai 4/5 paramètres, et comme ils servent pour un module de recherche, tous ne seront pas nécessaire!
    et je ne voulais pas avoir dans ma requete des "BookType = '' "ou "BookType = null", ce qui fausserait tout ^^

    merki
    lundi 14 janvier 2008 08:06
  • Bonjour,

    Ne vous en faites pas, moi aussi je suis un peu débordé en ce moment

    A ma connaissance il n'y a pas de moyen de de définir un paramètre optionel. C'est à vous de tester dans votre méthode Select définit par SelectMethod les valeurs fournies et de faire en fonction (par exemple si valeur = null, le paramètre n'est pas à prendre en compte).

     

    Guillaume

    lundi 14 janvier 2008 09:46
  • je n'arrive pas à definir le fait que ma méthode de Mapping soit dans le Default.aspx.cs :x


    toujours pour revenir a mon code d'origine, je trouve bizarre que l'on doit redefinir la pagination et le tri juste parce qu'on remplit la gridView à l'aide de la méthode RowDataBound!
    En refaisant des tests, je me suis rendu compte que la pagination fonctionnait sauf pour tous mes champs chargés à partir de la méthode RowDataBound(soit presque tous mes champs)!
    lundi 14 janvier 2008 13:30
  • Peux etre ai-je mal fait ma méthode RowDataBound!
    voici le début de mon code d'origine :

    //on teste que l'on est bien sur une DataRow
            if (DataControlRowType.DataRow != e.Row.RowType)
            {
                return;
            }
            DataTable dt = ((DataRowView)e.Row.DataItem).Row.Table;
            int index = e.Row.RowIndex;
            //affichage de la date
            lblDate.Text = ((DateTime)dt.Rows[index].ItemArray.GetValue(1)).ToShortDateString();

    forcement, je reparcourrais ma DataTable depuis le début, et mes données etaient mal affichées(mais c'etait logique, car mon index débutait toujours par 1, puis 2...)

    puis, j'ai recalculé la valeur de mon index par rapport a la pagination, et tout de suite ça marche mieux Wink


            int index = e.Row.RowIndex + (gvResultat.PageSize * gvResultat.PageIndex);

    j'attend vos conseils sur comment rendre mon code plus "propre" Big Smile

    merki

    lundi 14 janvier 2008 14:18
  • Bonjour,

    Je pense que votre première solution est la plus propre par contre pour le RowDataBound, avez vous vérifié si vous pouvez obtenir vos données directement à partir de ((DataRowView) e.Row.DataItem).Row ? Voir si e.Row.DataItemIndex ne contient pas déjà l'index correct ?

    Si les données ne sont pas correct, votre solution me parait la meilleur si vous ne pouvez vraiment pas utiliser le mapping direct des SqlDataSource.

     

    Guillaume

    lundi 14 janvier 2008 16:55
  • merci, ((DataRowView) e.Row.DataItem).Row["maColonne"] fonctionne Wink

    si j'avais utilisé ça plus tot, je n'aurais pas eu à m'arracher les cheveux pour la pagination Wink

    néanmoins j'aurai trouvé une solution quand meme

    merci
    mardi 15 janvier 2008 07:35
  • Bonjour,

    actuellement j'essaie d'afficher le nombre de lignes de ma Gridview
    actuellement j'utilise this.gvResultat.Rows.Count
    Mais combiner à la pagination, ça ne me retourne que le nombre de lignes affichées dans la page et non au total (de ma requete)!

    Je ne vois que de mettre un compteur dans la méthode RowDataBound()!

    merci
    mardi 22 janvier 2008 07:56
  • Bonjour,

    Si vous utiliser un SqlDataSource vous pouvez ajouter un handler sur l'évènement Selected :

     

    Extrait de code

    void DataSourceSelectedHandler(object sender, SqlDataSourceStatusEventArgs e)

    {

    // le nombre de ligne retournée est dans e.AffectedRows si vous avez

    // DataSourceMode = SqlDataSourceMode.DataSet

    int totalRowCount = e.AffectedRows;

    }

     

     

    Dans tout les cas RowDataBound ne marchera pas car il n'est, si je me souviens bien, appelé que pour les lignes visibles.

     

    Guillaume

    mardi 22 janvier 2008 09:02
  • Bonjour,

    Si vous utilisez un ObjectDataSource, vous avez normalement la propriété SelectCountMethod qui permet d'indiquer la méthode renvoyant le nombre d'élément au total. L'évènement Selected sur un ObjectDataSource n'est levé que si vous avez définit cette propriété.

     

    Guillaume

    mardi 22 janvier 2008 09:38
  • merci mais j'avais posté trop vite (d'ailleur je l'ai supprimé, mais vous l'avez vu quand meme Wink

    il s'agit bien d'un SqlDataSource (le ObjectDataSource n'avais pas été supprimé dans la page .aspx)

    J'ai développé ça (dans page_load()), et ça marche!
    cependant, j'aurais voulu externaliser ma méthode (comme pour votre exemple) mais je n'arrive pas à faire un handler.


    Extrait de code

    this._sds.Selected += new SqlDataSourceStatusEventHandler(delegate(object sender2, SqlDataSourceStatusEventArgs e2)
            {
                // le nombre de ligne retournée est dans e.AffectedRows si vous avez
                // DataSourceMode = SqlDataSourceMode.DataSet
                this.lblNbDemande.Text = e2.AffectedRows + " demandes trouvées.";
            });



    merki
    mardi 22 janvier 2008 09:52
  • Si vous voulez externaliser le calcul, il faudra faire vous même la requête en base avec un "SELECT COUNT(*) FROM ... WHERE ..." ou alors appeler la méthode Select sur votre SqlDataSource et si vous êtes en mode DataSet, vous pouvez ensuite caster le résultat en DataView et accéder à la propriété Count.

     

    Guillaume

    mardi 22 janvier 2008 10:30
  • Je me suis mal exprimé,

    je veux avoir une méthode

    void DataSourceSelectedHandler(object sender, SqlDataSourceStatusEventArgs e)

    {

    int totalRowCount = e.AffectedRows;

    }


    et pouvoir faire le handler dans page_load!

    moi j'ai directement mis la méthode dans mon page_load!

    this._sds.Selected += DataSourceSelectedHandler();

    avec le delegate etc, mais je n'ai pas trop compris comment ça fonctionnait!

    merki


    mardi 22 janvier 2008 10:43
  • Voila la syntax (si j'ai bien compris cette fois  ):

     

    Extrait de code

    protected void Page_Load(object sender, EventArgs e)

    {

    this._sds.Selected += new SqlDataSourceStatusEventHandler(DataSourceSelectedHandler);

    }

     

    void DataSourceSelectedHandler(object sender, SqlDataSourceStatusEventArgs e)

    {

    this.lblNbDemande.Text = e.AffectedRows.ToString() + " demandes trouvées.";

    }

     

     

    Guillaume
    mardi 22 janvier 2008 11:08
  • Tout a fait ça, merki Guillaume Big Smile
    mardi 22 janvier 2008 12:46