我的 ASP.NET 网站上有一个页面,其中有一个 Repeater 控件,用于显示网站成员的帖子。
目前,我将帖子的数据存储在 XML 文件中,然后将其缓存在网站内的自定义对象中。
所以我有:
public class MemberPost
{
public string Title { get; set; }
public string Text { get; set; }
public string Name { get; set; }
public DateTime Date { get; set; }
public List<string> Pictures { get; set; }
}
并且:
public class MemberPosts : List<MemberPost>
{
}
我可以将中继器的数据源设置为 MemberPosts 的实例,一切都按预期工作,但我想在添加更多帖子时添加分页。
我发现的所有示例似乎都涉及在数据库中对数据进行分页 - 有什么方法可以将转发器或其他类似的控件绑定到我的内存中 MemberPosts 集合并让它为我实现分页?
我正在使用 VS2010 / .NET 3.5,但如果需要,可以切换到 4.0,因为我的服务器上有该版本。
谢谢。
http://msdn.microsoft.com/en-us/library/bb358985.aspx
http://msdn.microsoft.com/en-us/library/bb503062.aspx
这些是您需要的 IEnumerable 中的 2 个方法。
你有
yourList.Skip(5).Take(5)
显示第二页 5 项。
使用“跳过并采取”的想法,我将以下内容放在一起,这非常简单并且非常有效,谢谢:-)
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;
}
}
您可以使用对象数据源进行绑定并在那里非常轻松地实现分页!这样你就可以完全重用可绑定控件逻辑.........