我运用了“跳过并取”的思想,把以下内容组合起来,非常简单,非常有用,谢谢:-)
protected void Page_Load(object sender, EventArgs e)
{
IEnumerable<MemberPost> posts = from post in MemberPostCacher.Instance.Posts
orderby post.Date descending
select post;
memberPostsRepeater.DataSource = GetPageMemberPosts(posts);
memberPostsRepeater.DataBind();
}
private IEnumerable<MemberPost> GetPageMemberPosts(IEnumerable<MemberPost> posts)
{
int totalNumberOfPosts = posts.Count();
int pageSize = int.Parse(ConfigurationManager.AppSettings["MemberPostsPageSize"]);
int totalPages = GetTotalPages(totalNumberOfPosts, pageSize);
int currentPage = 1;
if (Request.QueryString["page"] != null)
{
int.TryParse(Request.QueryString["page"], out currentPage);
if (currentPage < 1 || currentPage > totalPages)
{
currentPage = 1;
}
}
SetIntroVisibility(currentPage);
SetLinks(currentPage, totalPages);
SetPageNumberText(currentPage, totalPages);
return posts.Skip((currentPage - 1) * pageSize).Take(pageSize);
}
private int GetTotalPages(int numberOfPosts, int pageSize)
{
return numberOfPosts % pageSize == 0
? numberOfPosts / pageSize
: numberOfPosts / pageSize + 1;
}
private void SetIntroVisibility(int currentPage)
{
membersIntro.Visible = currentPage == 1;
}
private void SetLinks(int currentPage, int totalPages)
{
linkPrevious.Visible = currentPage != 1;
linkNext.Visible = currentPage != totalPages;
linkPrevious.NavigateUrl = FormatPageLink(currentPage - 1);
linkNext.NavigateUrl = FormatPageLink(currentPage + 1);
}
private string FormatPageLink(int pageNumber)
{
return string.Format("{0}{1}{2}",
Request.CurrentExecutionFilePath,
"?page=",
pageNumber);
}
private void SetPageNumberText(int currentPage, int totalPages)
{
lblNumRecords.Text = string.Format(" Page {0} of {1} ", currentPage, totalPages);
if(totalPages == 1)
{
lblNumRecords.Visible = false;
}
}