Подтвердить что ты не робот

ListView с DataPager не работает

Из всего, что я прочитал, казалось, что добавление пейджинга в элемент управления 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
4b9b3361

Ответ 1

Взгляните на 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 возвращается к первой странице, но отображаемые данные являются последней страницей.

Ответ 2

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

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

- Update

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

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

Ответ 3

Еще одно решение, простое, просто получить идентификатор в "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>

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

Ответ 4

Привязать listview к событию pre-render datapager не при загрузке страницы. См. Здесь

Ответ 5

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

Ответ 6

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

Ответ 7

попробуйте следующее:

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