2009-09-15 77 views
0

我遇到了一个问题,我在同一页面上有两个DataPagers,链接到同一个ListView。一切工作正常,除了“底部”或第二个传呼机似乎没有工作。生成页码,但点击它们什么也不做。如果我将“底部”寻呼机复制到“顶部”寻呼机的上方,那么该寻呼机将起作用,但下面的寻呼机不起作用。似乎只有至上寻呼机似乎工作:同一页面上的多个DataPagers

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

这应该是结果的第2页,结果表明26-50。但是,底部寻呼机不起作用。现在

,如果我硬编码:

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

两个传呼机的工作方式类似于应该,但结果的数量从27-51去。

任何人都可以重新创建它,这会让我疯狂吗?!?!?

更新2:

我想我得到了它之前已经被绑定到ListView设置页面属性的工作。

+0

为什么你有2个传呼机的1个列表视图? – cptScarlet 2009-09-15 19:31:51

+0

结果列表可能比较长(用户可以选择每页25,50,100个结果),并且我在结果列表的顶部和底部分页。 – 2009-09-15 19:38:51

回答

0

我想我已经想通了。

首先,我可以告诉你需要在设置页面属性之前先绑定列表视图。其次,我认为你误解了SetPageProperties方法的第一个参数。它不会设置当前页面,它会在此页面上设置第一条记录。

这里是我使用

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

这里的HTML在代码后面的代码

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

希望这有助于

+0

感谢您的回复。问题不是结果不能正确分页,如果我只使用“顶部”寻呼机,我会得到正确的结果。这只是第二个传呼机完全不起作用。就像我说的那样,如果我将第二个寻呼机移动到第一个寻呼机上面(那么第一个寻呼机将停止工作),它将起作用。 我也将绑定移到了SetPageProperties之前,但没有解决它。 – 2009-09-15 21:28:48

+0

您是否在后面的代码中更改了SetPageProperties代码?除非我将其修改为我上面的内容,否则分页不适用于我。否则,我得到了页码,但我无法点击它们。 – cptScarlet 2009-09-15 23:02:56

+0

我更新了我的答案,以显示我正在使用的所有HTML和C#代码,希望您能注意到我的代码和您的代码之间的重要区别。现在这对我很有用,我可以用两个寻呼机来寻呼。 – cptScarlet 2009-09-16 00:11:14

2

我也有类似的问题,在两个datapagers页面绑定到一个列表视图。数据采集​​器没有与每个数据采集器同步 - 因此对顶部和底部寻呼机的更改会导致寻呼机不能正常工作。这种方法让他们回到正轨:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
    { 
     DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
     DataPager2.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
    }