ListView с DataPager не работает - PullRequest
       23

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

19 голосов
/ 24 октября 2008

Из всего, что я прочитал, казалось, что добавление подкачки в элемент управления ListView должно быть очень простым, но это не работает для меня. После добавления элементов управления ListView и DataPager к форме и их соединения я получаю очень странное поведение. DataPager правильно ограничивает размер страницы ListView, но нажатие кнопок подкачки не влияет на ListView вообще. Кнопки подкачки, кажется, думают, что выполняют свою работу, поскольку последняя кнопка отключается, когда вы переходите на последнюю страницу и т. Д., Но ListView никогда не изменяется. Кроме того, требуется два щелчка мышью на DataPager, чтобы заставить его что-либо делать, то есть нажатие на Last last ничего не делает, но повторное нажатие на него заставляет 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

Ответы [ 7 ]

28 голосов
/ 30 декабря 2008

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

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

- Обновление

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

ListView_PagePropertiesChanged(object sender, EventArgs e)
{
ListView.DataSource=someDatasource;
ListView.DataBind()
}
4 голосов
/ 12 ноября 2012

Еще одно решение , это просто, просто получите «ID» в «QUERY-STRING» из базы данных, теперь установите его для свойства элемента управления Pager как [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" ].

1 голос
/ 09 декабря 2011

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

1 голос
/ 26 октября 2008

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

0 голосов
/ 07 ноября 2013

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

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
0 голосов
/ 15 марта 2013
<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 голосов
/ 11 января 2010

Кроме того, если источник данных вашего 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);
        //}
    }
}
...