0

我有一个问题,我在同一页面上有 2 个 DataPager,链接到同一个 ListView。一切正常,除了“底部”或第二个寻呼机似乎不起作用。页码已生成,但单击它们不会执行任何操作。如果我将“底部”寻呼机复制到“顶部”寻呼机上方,那么该寻呼机将起作用,但它下方的寻呼机不起作用。似乎只有首先出现的寻呼机似乎有效:

<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();
}

更新:

在又玩弄了一些之后,我确定如果 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 之前设置页面属性来实现它。

4

2 回答 2

2

我在绑定到一个列表视图的页面上的两个数据分页器遇到了类似的问题。数据分页器未与每个分页器同步 - 因此对顶部和底部分页器的更改会使分页器的外观无法正常工作。这种方法使他们重回正轨:

 protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
    {
        DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
        DataPager2.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    }
于 2011-04-11T23:26:47.507 回答
0

我想我已经弄清楚了。

首先,我可以告诉您在设置页面属性之前需要对列表视图进行数据绑定。

其次,我认为您误解了 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();
    }

希望这可以帮助

于 2009-09-15T20:34:56.923 回答