自定义GridView分页的自动序列号

时间:2016-07-24 06:16:28

标签: c# asp.net pagination

我正在使用GridView和Repeater的自定义分页。这是我到目前为止所做的代码:

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开始,而其他页面则相同。有没有办法解决或任何其他有效的技术来处理这个?

2 个答案:

答案 0 :(得分:1)

Container.DataItemIndex是绑定到GridView的数据项的索引,它可用于确定GridView行的行索引。因此它表现得像预期的那样。

您有两种选择: 1-使用您自己的rowcounter变量并将其存储在session或viewpag对象中。

2-更好,让数据库生成您的行号。例如,如果您使用的是Sql Server,请执行以下操作:

string startDate = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
string endDate = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
startDate.toUniversalTime();
endDate.toUniversalTime();
DateTime startDate1 = DateTime.Parse(startDate);
DateTime endDate1 = DateTime.Parse(endDate);

ViewBag.billHistory = db.tbl_electricity.
Where(x.INSRT_TMSP>= startDate1 && x.INSRT_TMSP<= endDate1).ToList();

答案 1 :(得分:1)

这是GridView自定义分页的解决方案:

<asp:TemplateField HeaderText="Serial Number">
    <ItemTemplate>
        <%# (detailsGridView.PageIndex * detailsGridView.PageSize) + (Container.DataItemIndex + 1) %>
     </ItemTemplate>
</asp:TemplateField>