我有一个包含转发器的用户控件,它的数据是使用IEnumerable对象设置的,该对象包含代码中从查询返回的数据。转发器具有分页功能,并为每个页面显示自定义的记录数。
每次用户单击下一个按钮以查看转发器中的下一页记录时,我不想加载所有数据。如何使其成为IQueryable并使用Skip()和Take()仅显示该页面所需的记录?
我有以下代码:
//Code that assigns query to repeater data source
DataSet = QueryGoesHere.ToArray(); // returns IEnumerable
repeater.DataSource = DataSet;
repeater.DataBind();
//Code that creates PagedDataSource - how can I update this to make it display only the records that are needed for the currently displayed page?
objPds = new PagedDataSource();
objPds.DataSource = DataSource
objPds.AllowPaging = true;
objPds.PageSize = 5;
objPds.CurrentPageIndex = CurrentPage;
lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of " + objPds.PageCount.ToString();
答案 0 :(得分:5)
如果我说得对,你想要使用自己的实现,而不是加载所有数据,然后使用PagedDataSource吗?
如果是这样,你必须确保QueryGoesHere
是一个支持它的Queryable(Linq2Sql或EF)。然后你必须得到这样的日期计数
var count = QueryGoesHere.Count();
并获取要显示的数据部分:
var skip = (curPageNumber - 1)*itemsPerPage;
var display = Math.Min(count - skip, itemsPerPage);
然后使用
var displayedItems = QueryGoesHere.Skip(skip).Take(display).ToArray();
这应该可以解决问题。
答案 1 :(得分:1)
PagedList和相关扩展程序对您有所帮助。请参阅:http://wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt
答案 2 :(得分:1)
public static Dictionary<string, string> SampleDataList(int startIndex, int pageSize)
{
Dictionary<string, string> sampleTable = new Dictionary<string, string>();
var query = from p in TemporaryData()
.Take(pageSize)
.Skip(startIndex)
select new
{
FirstColumn = p.Key,
SecondColumn = p.Value
};
foreach (var row in query)
{
sampleTable.Add(row.FirstColumn, row.SecondColumn);
}
return sampleTable;
}
以下链接将帮助您了解如何使用转发器分页
http://cmsnsoftware.blogspot.com/2011/07/how-to-use-custom-pagination.html