我有一个包含中继器的用户控件,它的数据量是使用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();
如果我说得对,你想使用自己的实现,而不是加载所有数据,然后使用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();
这就行了。
PagedList和相关扩展将对您有所帮助。请参阅:http://wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt
public static Dictionary<string, string> SampleDataList(int startIndex, int pageSize)
{
var sampleTable = new Dictionary<string, string>();
var page = TemporaryData().Skip(startIndex).Take(pageSize);
var query = from p in page
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