Вопрос

Судя по всему, что я прочитал, казалось, что добавление разбиения по страницам в элемент управления ListView должно быть очень простым, но у меня это не работает.После добавления в форму элементов управления ListView и DataPager и их соединения у меня наблюдается очень странное поведение.DataPager правильно ограничивает размер страницы ListView, но нажатие кнопок листания вообще не влияет на ListView.Кнопки перелистывания, похоже, думают, что выполняют свою работу, поскольку последняя кнопка отключается, когда вы переходите на последнюю страницу и т. д., но ListView никогда не меняется.Кроме того, требуется два щелчка по DataPager, чтобы заставить его что-либо сделать, т. е. нажатие на «Последний» один раз ничего не дает, но щелчок по нему во второй раз приводит к тому, что DataPager реагирует так, как будто теперь выбрана последняя страница.

Единственное, о чем я могу думать, это то, что я привязываю DataSource во время выполнения (к объекту LINQ), а не использую элемент управления LinqDataSource или что-то еще.Кто-нибудь видел такое поведение?Я делаю что-то неправильно?Вот код, который я использую:

<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>

В коде программной части:

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
Это было полезно?

Решение

Посмотрите на 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;
}

У меня проблема с просмотром последней страницы. DataPager возвращается на первую страницу, но отображаемые данные являются последней страницей.

Другие советы

Нам нужно снова просмотреть список привязки данных в событии OnPreRender.

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

--Обновлять

Поработав над несколькими представлениями списков с помощью asp.net ajax, я увидел решение, которое имеет больше смысла, чем приведенное выше.Обычно вы привязываете данные Listview к методу загрузки страницы или обработчику событий нажатия кнопки, и когда происходит обратная связь, привязка данных будет потеряна, как описано выше в проблеме.Итак, нам нужно снова привязать данные к свойствам страницы, изменив обработчик событий для представления списка.

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

Еще одно решение , его просто, просто получите " идентификатор " в " QUERY-STRING " из базы данных теперь установите его для свойства элемента управления пейджером как [QueryStringField = " ID " ] нравится:

<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>

Примечание: , если не проснулся, то также установите [PagedControlID = " ListView_Name " ] .

Привязать просмотр списка к событию предварительного рендеринга datapager, а не к загрузке страницы. Ознакомьтесь с решением здесь

Кроме того, если источник данных вашего ListView изменяется (например, при отображении данных на основе параметров поиска), не забывайте сбрасывать пейджер каждый раз, когда источник данных обновляется. С ListView это не так просто, как некоторые другие элементы управления с привязкой к данным (например, 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);
        //}
    }
}
<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 ">

попробуйте это

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top