2016-07-24 57 views
0

我爲GridView和Repeater使用自定義分頁。以下是我迄今爲止所做的代碼:自定義GridView分頁的自動序列號

Default.aspx: 
<asp:Repeater ID="rptPager" runat="server"> 
<ItemTemplate> 
    <asp:LinkButton ID="lnkPage" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%# Eval("Value") %>' 
     CssClass='<%# Convert.ToBoolean(Eval("Enabled")) ? "page_enabled" : "page_disabled" %>' 
     OnClick="lnkPage_Click" PostBackUrl='<%# "~/UI/SearchCity.aspx?page=" + Eval("Text") %>' OnClientClick='<%# !Convert.ToBoolean(Eval("Enabled")) ? "return false;" : "" %>'></asp:LinkButton> 
</ItemTemplate> 
</asp:Repeater> 

Default.aspx.cs: 
private void BindGridView(int pageIndex) //Bind data 
{ 
    List<Country> countryListView = null; //List type variable 

    countryListView = aManager.AllCountryList(); //Assigns the data in the list calling the method 

    totalRecordCount = countryListView.Count; //Counts total no. of record 
    pageSize = 4; //Page size 
    int startRow = pageIndex * pageSize; //Variable to assign the starting row 

    detailsGridView.DataSource = countryListView.Skip(startRow).Take(pageSize); //Shows data in GridView 
    detailsGridView.DataBind(); 
} 

private void BindPager(int currentPageIndex) //Pagination 
{ 
    double getPageCount = (double)((decimal)totalRecordCount/(decimal)pageSize); 
    int pageCount = (int)Math.Ceiling(getPageCount); //Count page 

    List<ListItem> pages = new List<ListItem>(); //New list item 

    /****Pagination starts ****/ 
    if (pageCount > 1) 
    { 
     pages.Add(new ListItem("<<", "1", currentPageIndex > 0)); 

     for (int i = 1; i <= pageCount; i++) 
     { 
      pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPageIndex + 1)); 
     } 

     pages.Add(new ListItem(">>", pageCount.ToString(), currentPageIndex < pageCount - 1)); 
    } 
    /****Pagination ends ****/ 

    rptPager.DataSource = pages; 
    rptPager.DataBind(); 
} 

上述工作完美。但問題是,當我使用以下方法來生成自動編號,它不能正常工作:

<%#(Container.DataItemIndex+1)%> 

我的意思是,當我瀏覽到第2頁,行數,從1開始,同爲其他頁面。有什麼辦法可以解決這個問題嗎?

回答

0

的Container.DataItemIndex是綁定到GridView的數據項的指數,它可以被用來確定在GridView行的行索引。因此它的行爲如預期。

你有兩個選擇: 1-使用自己的rowcounter變量並將其存儲在會話或viewpag對象。

2-更好,讓數據庫生成的行號代替。例如,如果您正在使用SQL Server,然後做這樣的事情:

SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) ROW_NUM, * FROM MYTABLE 
+0

我曾嘗試這個生成自動編號:。然後最後這個,int serialNo = 1;保護無效detailsGridView_RowDataBound(對象發件人,GridViewRowEventArgs E){如果(e.Row.RowType == DataControlRowType.DataRow){如果(!String.IsNullOrEmpty(((標籤)e.Row.FindControl( 「labelSerialNo」))。文) ){Label labelSerialNo =(Label)e.Row.FindControl(「labelSerialNo」); labelSerialNo.Text = serialNo.ToString(); serialNo = serialNo + 1; }}}。但它沒有奏效。如果可能的話,讓我知道我是否遺漏了一些東西。我更喜歡選項2並且工作。 –

+0

serialNo應該在頁面瀏覽中持久保存。因此,您應該保存它並在需要時檢索它以保持其值:'Session [「serialNo」] = serialNo;''和'serialNo = int.Parse(Session [「serialNo」]。ToString());' – TruthSeeker

+0

這應該是在同一頁。是否需要保持會話中的值? –