Question

D'après tout ce que j'ai lu, il semblait que l'ajout de la 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 reliés entre eux, le comportement devient étrange. Le DataPager limite correctement la taille de la page du ListView, mais le fait de cliquer sur les boutons de pagination n'a aucune incidence sur le ListView. Les boutons de pagination semblent penser qu'ils font leur travail, car le dernier bouton est désactivé lorsque vous allez à la dernière page, etc., mais la vue liste ne change jamais. De plus, il faut deux clics sur le DataPager pour qu’il fasse quoi que ce soit, c’est-à-dire que cliquer sur Dernière fois ne fait rien, mais qu’il clique une seconde fois, le DataPager réagit comme si la dernière page était maintenant sélectionnée.

La seule chose à laquelle je peux penser est que je lie le DataSource au moment de l'exécution (à un objet LINQ), sans utiliser de contrôle LinqDataSource ou quoi que ce soit. Quelqu'un a-t-il vu ce comportement? Est-ce que je fais quelque chose de mal? Voici le code que j'utilise:

<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
Était-ce utile?

La solution

Jetez un coup d'œil à 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, j'ai un problème pour afficher la dernière page. Le DataPager revient à la première page, mais les données affichées sont la dernière page.

Autres conseils

Nous avons besoin de rétablir l’affichage de la liste dans l’événement OnPreRender.

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

- Mise à jour

Après avoir travaillé sur quelques vues de liste avec asp.net ajax, j'ai trouvé une solution plus logique que la précédente. Vous devez normalement lier la méthode Listview on page load à la liaison de données ou un gestionnaire d’événements de clic de bouton et, lorsqu’il y a une publication, la liaison de données est perdue comme décrit ci-dessus dans le problème. Nous avons donc besoin de relier à nouveau les données sur les propriétés de la page. Le gestionnaire d’événements modifié pour la vue Liste.

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

Une solution de plus , c'est simple, il suffit juste d'obtenir "ID" dans " QUERY-STRING " de la base de données, maintenant définissez-le sur la propriété de contrôle du pageur comme suit: [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>

Remarque: si vous ne le faites pas, définissez également [PagedControlID = " ListView_Name " ] .

Liez la vue liste lors de l'événement de pré-rendu du datapager, et non au chargement de la page. Veuillez consulter la solution ici

De même, si la source de données de votre ListView est modifiée (par exemple, si vous affichez des données en fonction de paramètres de recherche), n'oubliez pas de réinitialiser le pager à chaque fois que la source de données est mise à jour. Avec un ListView, cela n’est pas aussi simple que d’autres contrôles liés aux données (GridView, par exemple):

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);
        //}
    }
}
<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 ">

essayez ceci:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top