none
pagination dans datagrid RRS feed

  • Question

  • boonjour

    Apres avoir resolu tous mes pb d'authentification, de serveur, de connectionString et de drotis sur les fichiers (... ! merci encore à vous) j'attaque maintenant le fond du pb , qui semble bien plus simple mais sur lequel jer encontre un mesg d'erreru que je ne sais pas trop interprété :
    Voila j'affiche un grid view (isssue d'une vue accessible via LINQ)
    Voici mon code (essentiellment résumé à la gestion du grid view :)

    // datasource issue d'une via LINQ (ledatc = datacontontext de linq)             
    mygrid.DataSource = ledatc.vueTestAlainPortailSharePoint; //gestion du lien detail par objet ButtonColumn this.mygrid.AutoGenerateColumns = true; this.mybut.Text = "détails"; this.mybut.CausesValidation = true; this.mygrid.Columns.Add(mybut); //gestion de la presentation this.mygrid.AlternatingItemStyle.BackColor = Color.Bisque; this.mygrid.HeaderStyle.BackColor = Color.Brown; this.mygrid.HeaderStyle.ForeColor = Color.Bisque; //gestion de la pagination this.mygrid.EnableViewState = false; this.mygrid.AllowPaging = true; this.mygrid.PageSize = 10; this.mygrid.PagerStyle.Visible = true; this.mygrid.PagerStyle.Mode = PagerMode.NumericPages; this.mygrid.PagerStyle.PageButtonCount = 10; this.mygrid.PageIndexChanged += new DataGridPageChangedEventHandler(mygrid_PageIndexChanged); // ici on gere le lien sur les boutons pour acceder à la fiche détail selectionnée this.mygrid.ItemCommand += (mygrid_AccesDetail); this.mygrid.DataBind(); this.Controls.Add(mygrid);
    et voci la methode qui gere l'evenement quand on clique sur une des n°s de page en bas du gridview :

     void mygrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
            {
              mygrid.CurrentPageIndex = e.NewPageIndex;
              mygrid.DataBind();
    }
    et lorsque je clic , j'obtiens systematiquement ce message  :

    Specified argument was out of the range of valid values.
    Parameter name: index



    je ne comprend pas pourqoi cet index n'est pas généré automatiquement dans l'évenement.
    Que faut il donc rajouté au code pour que ça fonctionne correctement ?
    Merci à vous tous et bonne journée
    Alain

    vendredi 27 novembre 2009 06:56

Toutes les réponses

  • Bonjour Alain,

    Avant d'effectuer le databinding, il faudrait que le contrôle soit dans la page.
    this.mygrid.DataBind(); devrait être situé après this.Controls.Add(mygrid);

    Si ça ne fonctionne toujours pas, pourriez-vous svp nous montrer tout le code du contrôle ?
    Il nous manque une vue d'ensemble pour pouvoir vous aider.
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Proposé comme réponse Arnault Nouvel samedi 28 novembre 2009 09:38
    samedi 28 novembre 2009 09:38
  • bonjour Arnault

    Merci de nouveau de venir m'aider
    Je vous envoie l'integralité du webpart qui, pour rappel, affiche dans un premier temps, les données issues d'une table sql via Linq . Paratn de là un tableau html est généré avec en supplément un bouton pour effecter une recherche par critère et la fameuse pagination (celle par defaut) :

    using System;
    using System.Runtime.InteropServices;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Serialization;
    using System.Web;
    using System.Collections.Generic;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using Microsoft.SharePoint.WebPartPages;
    using System.Drawing.Design;
    using System.Drawing;
    using System.Web.UI.HtmlControls;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web.Security;
    using Microsoft.SharePoint.Administration;
    using System.Web.Configuration;
    
    
    
    namespace WEBPART_annuaireGenepi
    {
        [Guid("4aac307b-f91e-4b05-a09c-df0c5130008a")]
        public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart
        {
            // DEFINITION DES composants "graphique" de la page
            DataGrid mygrid = new DataGrid();
            ButtonColumn mybut = new ButtonColumn();
            TextBox byname = new TextBox();
            TextBox byfonc = new TextBox();
            Label lib = new Label();
            TextBox lblMessage = new TextBox();
            String topClicBouton = "";
            //Button boutnom = new Button();
            Button boutfonc = new Button();
            HyperLinkField lelien = new HyperLinkField();
            // datcontext LINQ
            DataClasses1DataContext ledatc;
            // nom du site
            SPWebApplication wa = SPWebApplication.Lookup(new Uri(SPContext.Current.Web.Url));
            
            public WebPart1()
            {
                this.ExportMode = WebPartExportMode.All;
            }
    
            public void critFoncSearchZone(object sender, EventArgs e)
            {
                
                // gestion de la recherche affinée par critères (nom ou fonction)
                topClicBouton = "y";
                //mygrid.DataSource = ledatc.proc_fonction(byfonc.Text.ToUpper());
                mygrid.DataSource = ledatc.NomEtFonction(byfonc.Text.ToUpper(), byname.Text.ToUpper());
                mygrid.DataBind();
            }
           
            void mygrid_AccesDetail(object sender, DataGridCommandEventArgs e)
            {
                // active le lien'détail' vers la bonne page (server test ou server prod)
                var lesite = wa.Name;
                if (lesite.Contains("Test"))
                {
                    // POUR LIEN SUR SERVEUR TEST
                    mygrid.Page.Response.Redirect("url..../detailContact.aspx?PageView=Shared?id=" + e.Item.Cells[8].Text);
                }
                else
                {
                    // POUR LIEN SUR SERVEUR PROD
                    mygrid.Page.Response.Redirect("url ...Detail_Contact.aspx?PageView=Shared?id=" + e.Item.Cells[8].Text);
                }
            }
    
            void mygrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
            {
                    //gestion pour la pagination    
                    mygrid.CurrentPageIndex = e.NewPageIndex;
                    mygrid.DataBind();
            }
    
            protected override void CreateChildControls()
            {
               // CODE POUR ACCES VIA WEB CONFIG ET CONNECTIONSTRING 
               // acces connection string
                SPWebApplication wa = SPWebApplication.Lookup(new Uri(SPContext.Current.Web.Url));
                var config = WebConfigurationManager.OpenWebConfiguration("/", wa.Name);
                string _sqlConnectionString = config.ConnectionStrings.ConnectionStrings["MaConnectionString"].ToString();
    
                // instance du data context LINQ
                ledatc = new DataClasses1DataContext(_sqlConnectionString);
               
                // gestion de l'évènement click sur le bouton "recherche"(ok)
                boutfonc.Click += (critFoncSearchZone);
    
                base.CreateChildControls();
    
                // CONCEPTION DU TABLEAU haut
                // entête
    
                this.Controls.Add(new LiteralControl("<table cellspacing='3' cellpadding='5' align='center' border = 0 width=620px>"));
                // titre
                this.Controls.Add(new LiteralControl("<tr>"));
                this.Controls.Add(new LiteralControl("<td style='width:620px' colspan = 3>"));
                this.Controls.Add(new LiteralControl("<B>Liste des Contacts de la Base SQL -(version pagination - 4 )- </B>"));
                this.Controls.Add(new LiteralControl("</td>"));
                this.Controls.Add(new LiteralControl("</tr>"));
                // critères nom
                this.Controls.Add(new LiteralControl("<tr>"));
                this.Controls.Add(new LiteralControl("<td style='width:620px' colspan = 3>"));
                this.Controls.Add(new LiteralControl("Recherche par Nom : "));
                this.Controls.Add(byname);
                this.Controls.Add(new LiteralControl(" et / ou par Fonction : "));
                this.Controls.Add(byfonc);
                this.Controls.Add(new LiteralControl("      "));
                boutfonc.Text = "ok";
                boutfonc.CausesValidation = true;
                this.Controls.Add(boutfonc);
                this.Controls.Add(new LiteralControl("</td>"));
                this.Controls.Add(new LiteralControl("</tr>"));
                this.Controls.Add(new LiteralControl("</table>"));
                this.Controls.Add(new LiteralControl("<table cellspacing='3' cellpadding='5' align='center'>"));
                this.Controls.Add(new LiteralControl("<tr>"));
                this.Controls.Add(new LiteralControl("<td style='width:620px'>"));
    
               if(topClicBouton !="y")
                {
                    mygrid.DataSource = ledatc.vueTestAlainPortailSharePoint_AnnuaireGenepi;
                }
                
                //gestion du lien par objet ButtonColumn
                this.mygrid.AutoGenerateColumns = true;
                this.mybut.Text = "détails";
                this.mybut.CausesValidation = true;
                this.mygrid.Columns.Add(mybut);
    
                //gestion de la presentation
                this.mygrid.AlternatingItemStyle.BackColor = Color.Bisque;
                this.mygrid.HeaderStyle.BackColor = Color.Brown;
                this.mygrid.HeaderStyle.ForeColor = Color.Bisque;
    
                //gestion de la pagination
                this.mygrid.EnableViewState = false;
                this.mygrid.AllowPaging = true;
                this.mygrid.PageSize = 10;
                this.mygrid.PagerStyle.Visible = true;
    
                this.mygrid.PagerStyle.Mode = PagerMode.NumericPages;
                this.mygrid.PagerStyle.PageButtonCount = 10;
    
                mygrid.PageIndexChanged += new DataGridPageChangedEventHandler(mygrid_PageIndexChanged);
    
                // ici on gere le lien sur les boutons pour acceder à la fiche détail selectionnée
                this.mygrid.ItemCommand += (mygrid_AccesDetail);
    
                // conseil Arnault :this.mygrid.DataBind(); devrait être situé après this.Controls.Add(mygrid);
                this.Controls.Add(mygrid);
                this.mygrid.DataBind();
    
                // pour test uniquement - affichage de valeurs des variables de ce code
                lib.Text = " Zone test : valeur de l'index :   " ;
                lblMessage.Text = mygrid.CurrentPageIndex.ToString() ;
                lblMessage.Width = 20;
                this.Controls.Add(lib);
                this.Controls.Add(lblMessage);
                this.Controls.Add(new LiteralControl("</td>"));
                this.Controls.Add(new LiteralControl("</tr>"));
    
                // fin balise table
                this.Controls.Add(new LiteralControl("</table>"));
            }
        }
    }
    
    voici donc ce que je fais ... 
    et aussi quand je clique sur le bouton détail pour acceder à l'ensemble des informations sur une page détail, je trouve un message d'erreur lorsque semble t il un enregistrement contient une zone "vide" ce message est du style
    "la valeur du champ string ne peut être null" ... y a t il  un moyen de forcer une zone vide à s'afficher ou est ce du à un pb exclusivemlent sql ? (en fin, je veux pas abuser hein, ..... une chose à la fois ;-))

    Merci encore et bon début de semaine à vous
    Alain
    lundi 30 novembre 2009 07:47
  • Bonjour,

    désolé de ne pas avoir répondu plus tôt, semaine difficile :)

    Avez vous essayé de réaffecter la propriété DataSource de la gridview juste avant le DataBind() dans PageIndexChanged ?
    Je pense que ca pourrait aider : le contenu de cette propriété est probablement déchargé avant l'appel au second DataBind();

    Est-ce que cela résoud le problème ?


    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Proposé comme réponse Arnault Nouvel dimanche 6 décembre 2009 10:47
    dimanche 6 décembre 2009 10:47