Несколько DataPager на одной странице - PullRequest
0 голосов
/ 15 сентября 2009

У меня проблема с тем, что у меня есть 2 DataPager на одной странице, связанные с тем же ListView. Все работает нормально, кроме «нижнего» или 2-го пейджера, похоже, не работает. Номера страниц генерируются, но нажатие на них ничего не делает. Если я скопирую «нижний» пейджер над «верхним» пейджером, то этот пейджер будет работать, а тот, что ниже, - нет. Кажется, работает только пейджер, который появляется первым:

<asp:DataPager ID="dpPagerTop" runat="server" PagedControlID="lvOutput" QueryStringField="pageNumber">
    <Fields>
        <asp:NumericPagerField NextPageText="Next" PreviousPageText="Previous" />
    </Fields>
</asp:DataPager>

<asp:DataPager ID="dpPagerBottom" runat="server" PagedControlID="lvOutput" QueryStringField="pageNumber">
    <Fields>
        <asp:NumericPagerField NextPageText="Next" PreviousPageText="Previous" />
    </Fields>
</asp:DataPager>

<asp:ListView ID="lvOutput" runat="server" OnPagePropertiesChanged="lvOutput_PagePropertiesChanged">
    <LayoutTemplate>
        <asp:PlaceHolder id="itemPlaceholder" runat="server" />
    </LayoutTemplate>
    <ItemTemplate>
        <a href="<%# Eval("Link") %>" title="<%# Eval("Title") %>"><%# Eval("Title") %></a>
    </ItemTemplate>
</asp:ListView>


protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        dpPagerTop.SetPageProperties(Request.QueryString["pageNumber"].ToString(), 25, false);
        dpPagerBottom.SetPageProperties(Request.QueryString["pageNumber"].ToString(), 25, false);

        lvOutput.DataSource = [datasource];
        lvOutput.DataBind();
    }
}


protected void lvOutput_PagePropertiesChanged(object sender, EventArgs e)
{
    lvOutput.DataBind();
}

UPDATE:

Поразмышляя над этим еще раз, я решил, что оба пейджера будут работать, если SetPageProperties имеет правильные параметры. Первый параметр должен быть числом для запуска результатов, а второй должен быть числом для отображения результатов. Тем не менее, я получаю неправильные цифры для отображения. У меня есть ровно 100 записей, и я хочу отображать 25 результатов на странице. Если я жестко закодировал:

dpPagerTop.SetPageProperties(25, 25, true);
dpPagerBottom.SetPageProperties(25, 25, true);

Это должна быть вторая страница результатов, и результаты показывают 26-50 . Тем не менее, нижний пейджер не работает.

Теперь, если я жестко закодировал:

dpPagerTop.SetPageProperties(26, 25, true);
dpPagerBottom.SetPageProperties(26, 25, true);

Оба пейджера работают как следует, но число результатов идет от 27-51 .

Может кто-нибудь воссоздать это, это сводит меня с ума?!?!?

ОБНОВЛЕНИЕ 2:

Я думаю, что заставил его работать, установив свойства страницы ДО привязки к ListView.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

У меня была похожая проблема с двумя страницами данных на странице, привязанной к одному списку. пейджеры данных не синхронизировались с каждым из них - поэтому изменения на верхний, а затем на нижний пейджеры могут привести к тому, что пейджер не будет работать. Этот метод вернул их на путь:

 protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
    {
        DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
        DataPager2.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    }
0 голосов
/ 16 сентября 2009

Мне кажется, я понял это.

Во-первых, из того, что я могу сказать, вам нужно связать данные со списком, прежде чем устанавливать свойства страницы.

Во-вторых, я думаю, вы неправильно понимаете первый параметр метода SetPageProperties. Он не устанавливает текущую страницу, он устанавливает первую запись на этой странице данных.

Вот HTML-код, который я использую

<asp:DataPager ID="dpPagerTop" runat="server" PagedControlID="lvOutput" QueryStringField="pageNumber"
    PageSize="2">
    <Fields>
        <asp:NumericPagerField NextPageText="Next" PreviousPageText="Previous" />
    </Fields>
</asp:DataPager>
<asp:DataPager ID="dpPagerBottom" runat="server" PagedControlID="lvOutput" QueryStringField="pageNumber"
    PageSize="2">
    <Fields>
        <asp:NumericPagerField NextPageText="Next" PreviousPageText="Previous" />
    </Fields>
</asp:DataPager>

<asp:ListView ID="lvOutput" runat="server" OnPagePropertiesChanged="lvOutput_PagePropertiesChanged">
    <LayoutTemplate>
        <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
    </LayoutTemplate>
    <ItemTemplate>
        <a href="Donation.aspx" title="<%# Eval("Type") %>">
            <%# Eval("id")%></a>
    </ItemTemplate>
</asp:ListView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:LutheranAssistanceConnectionString %>" 
    SelectCommand="SELECT [Id], [RecipientId], [Type], [Reason] FROM [Donations]">
</asp:SqlDataSource>

Вот код в коде

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            //bind the list view first
            lvOutput.DataSource = SqlDataSource1;
            lvOutput.DataBind();

            //the first parameter of SetPageProperties is not the page number 
            //it is index of the first record on the page
            //So we need to calculate the index based on the passed in page number.
            int pageNumber = Convert.ToInt32(Request["pageNumber"]);
            int recordNumber = pageNumber * dpPagerTop.PageSize;

            //now set first record
            dpPagerTop.SetPageProperties(recordNumber , 25, false); 
            dpPagerBottom.SetPageProperties(recordNumber , 25, false);
        }
    }

    protected void lvOutput_PagePropertiesChanged(object sender, EventArgs e)
    {
        lvOutput.DataBind();
    }

Надеюсь, это поможет

...