2009-01-24 7 views
2

J'essaie d'implémenter un DataGrid dans ASP.NET et je souhaite effectuer une pagination personnalisée afin que je n'ai pas à fournir toutes les données en une fois. J'ai passé plusieurs heures à faire des recherches sur internet, mais je n'ai rien trouvé d'utile.DataGrid et la pagination personnalisée ASP.NET

Lorsque je vois la page, je vois le premier ensemble de résultats dans la grille, avec le lien précédent désactivé. Lorsque je clique sur le suivant, je vois à nouveau la première page de la grille avec le lien précédent désactivé. Lors du débogage du code, j'ai vérifié que le gestionnaire d'événements MyGrid_PageIndexChanged() n'est jamais appelé.

J'ai inclus mon code simplifié ci-dessous. J'ai modifié les noms de variables et les méthodes omises pour me concentrer sur le problème de pagination de DataGrid.

Dans le fichier ASPX:

<asp:DataGrid ID="myGrid" runat="server" GridLines="None" UseAccessibleHeader="true" AutoGenerateColumns="false" AllowPaging="true" AllowCustomPaging="true" PageIndexChanged="MyGrid_PageIndexChanged"> 
<PagerStyle Mode="NextPrev" NextPageText="Next >" PrevPageText="< Previous" /> 

<Columns> 
<asp:BoundColumn HeaderText="Title" DataField="Name" /> 
<asp:BoundColumn HeaderText="Date" DataField="Date" /> 
</Columns> 
</asp:DataGrid> 

Et dans le fichier CS:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
          myGrid.PageSize = 20; 
          myGrid.VirtualItemCount = GetNumItems(); 
      BindMyGrid(); 
     } 
    } 

    protected void MyGrid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e) 
    { 
     myGrid.CurrentPageIndex = e.NewPageIndex; 
     BindMyGrid(); 
    } 

    private int GetNumItems() 
    { 
     return 500; 
    } 

    private void BindMyGrid() 
    { 
      Data[] array = GetDataFromInternetSomehow(); 
      this.myGrid.DataSource = array; 
      this.myGrid.DataBind(); 
    } 

    private class Data 
    { 
     public string Date { get; set; } 
     public string Name { get; set; } 
    } 

Toute réflexion sur ce serait très apprécié.

Répondre

8

Il y a une erreur dans votre ASPX: pour câbler le gestionnaire d'événements PageIndexChanged utiliser la propriété OnPageIndexChanged (non PageIndexChanged comme dans votre code):

<asp:DataGrid ID="myGrid" runat="server" 
    OnPageIndexChanged="MyGrid_PageIndexChanged" /// <--- here's the error 
    ... 

Ensuite, si vous avez AllowCustomPaging = "true", vous devez vous assurer que la méthode GetDataFromInternetSomehow() renvoie uniquement les données de la page actuellement sélectionnée, par exemple passer la page en cours à la méthode et retourner uniquement les données correspondantes:

GetDataFromInternetSomehow(e.NewPageIndex); 

Sinon, désactivez la pagination personnalisée et cela fonctionnera (mais toutes les données seront chargés à chaque fois).

+0

Génial - merci. L'ajout de "On" l'a fait fonctionner - une telle différence que deux lettres peuvent faire. Je pense que tout en lisant des échantillons sur internet je viens de voir l'attribut et j'ai pensé "yup, j'ai compris". Bizarre qu'il n'y avait pas une erreur de compilation ou d'exécution si. – Saqib

+0

@SaqibJe sais que c'est ancien, mais marquez cette réponse comme réponse acceptée. – eglasius

Questions connexes