2008-10-24 6 views
19

De tout ce que j'ai lu, il semblait que l'ajout de pagination à un contrôle ListView devrait être simple, mais cela ne fonctionne pas pour moi. Après avoir ajouté les contrôles ListView et DataPager au formulaire et les avoir câblés ensemble, j'ai un comportement très étrange. Le DataPager limite correctement la taille de la page ListView, mais en cliquant sur les boutons de pagination n'affecte pas le ListView du tout. Les boutons de pagination semblent penser qu'ils font leur travail, car le dernier bouton est désactivé quand vous allez à la dernière page, etc., mais le ListView ne change jamais. En outre, il faut deux clics sur le DataPager pour l'obliger à faire quoi que ce soit, c'est-à-dire cliquer une fois sur Last ne fait rien, mais cliquer une seconde fois provoque le DataPager à réagir comme si la dernière page est maintenant sélectionnée. La seule chose que je peux penser est que je lie la DataSource à l'exécution (à un objet LINQ), n'utilisant pas un contrôle LinqDataSource ou quoi que ce soit. Quelqu'un at-il vu ce comportement? Est-ce que je fais quelque chose de mal? Voici le code que je utilise:ListView avec DataPager ne fonctionne pas

<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10"> 
    <Fields> 
     <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" /> 
    </Fields> 
</asp:DataPager> 

<asp:ListView ID="HistoryListView" runat="server"> 
    ... 
</asp:ListView> 

Dans le code-behind:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If Not IsPostBack Then 
     HistoryListView.DataSource = From x in myContext.myTables ... 
     DataBind() 
    End If 

End Sub 

Répondre

1

Jetez un oeil à la ListViewPagedDataSource.

private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv) 
{ 
// Limit the results through a PagedDataSource 
ListViewPagedDataSource pagedData = new ListViewPagedDataSource(); 
pagedData.DataSource = dv; 
pagedData.MaximumRows = dv.Table.Rows.Count; 
pagedData.TotalRowCount = dpTop.PageSize; 

if (Request.QueryString[dpTop.QueryStringField] != null) 
    pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize; 
else 
    pagedData.StartRowIndex = 0; 

return pagedData; 
} 

Cependant, un problème est survenu lors de l'affichage de la dernière page. Le DataPager revient à la première page, mais les données affichées sont la dernière page.

28

Nous devons à nouveau afficher la liste de données dans l'événement OnPreRender.

protected override void OnPreRender(EventArgs e) 
     { 
      ListView1.DataBind(); 
      base.OnPreRender(e); 
     } 

--update

Après avoir travaillé sur quelques vues de la liste avec ajax asp.net, j'ai vu une solution qui est plus logique que celui ci-dessus. Normalement, les données lient Listview sur la méthode de chargement de la page ou un gestionnaire d'événements de clic sur un bouton et, lorsqu'il y a publication, la liaison de données est perdue comme décrit ci-dessus dans le problème. Nous avons donc besoin de lier à nouveau les données sur les propriétés de la page modifiées gestionnaire d'événements pour la vue de la liste.

ListView_PagePropertiesChanged(object sender, EventArgs e) 
{ 
ListView.DataSource=someDatasource; 
ListView.DataBind() 
} 
+1

Vous n'êtes pas obligé de Databind il * nouveau *. Mais oui, vous pouvez résoudre ce problème par liaison de données dans le prerender. –

+1

C'est la chose la plus stupide que j'ai jamais vue depuis ASP.net (même si je suis sûr qu'il y a pire). Mais merci de le trouver. Je n'ai jamais pensé qu'il y aurait un bug pre_render. – Dexter

+0

@Syam quand j'utilise le remplacement de pré-rendu, la source de données listView est nulle (en cliquant sur le bouton suivant) et aucun enregistrement n'est affiché ... des suppositions? – tariq

0

De plus, si la source de données de votre ListView est modifiée (par exemple si l'affichage des données en fonction des paramètres de recherche), ne pas oublier de réinitialiser le récepteur d'appel à chaque fois que la source de données est mise à jour. Avec un ListView ce n'est pas aussi simple que d'autres contrôles liés aux données (par exemple GridView):

private void ResetListViewPager() 
{ 
    DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1"); 
    if (pager != null) 
    { 
     CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, ""); 
     // MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER 
     NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField; 
     if (nextPreviousPagerField != null) 
     { 
      nextPreviousPagerField.HandleEvent(commandEventArgs); 
     } 

     // THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER 
     //commandEventArgs = new CommandEventArgs("0", ""); 
     //NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField; 
     //if (numericPagerField != null) 
     //{ 
     // numericPagerField.HandleEvent(commandEventArgs); 
     //} 
    } 
} 
1

Bind ListView lors de l'événement avant de rendre DataPager pas à la charge de page. S'il vous plaît voir le solution here

4

One More Solution, Son Simple, Just Get "ID" dans "QUERY-STRING" de la base de données, vous présenter maintenant à la propriété de contrôle Pager comme [QueryStringField = "ID"] comme:

<asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3"> 
          <Fields> 
           <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" /> 
           <asp:NumericPagerField /> 
           <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" /> 
          </Fields> 
         </asp:DataPager> 

note: sinon woking, puis réglez également [ PagedControlID="ListView_Name" ].

+0

Superbe !!!!!! Cela a résolu mon problème là où tout le reste avait échoué! – James

+0

Cette réponse n'a aucun sens du tout. – MC9000

0
<asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages"> 
    <ItemTemplate> 
     <div class="photo sample12"> 
       <asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' /> 
     </div> 
    </ItemTemplate> 
</asp:ListView> 
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID"> 
    <Fields> 
     <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" /> 
     <asp:NumericPagerField /> 
     <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" /> 
    </Fields> 
</asp:DataPager> 
<asp:SqlDataSource ID="sdsImages" runat="server" 
    ConnectionString="<%$ ConnectionStrings:DBCS %>" 
    SelectCommand="SELECT ImageID FROM Images "> 

+0

Pouvez-vous fournir une explication? – CraigTeegarden

0

essayez ceci:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
{ 
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
    ListView1.DataSource = productList; 
    ListView1.DataBind(); 
    DataPager1.DataBind(); 
}