2009-09-15 100 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); 
    }