Сегодня я попытался сделать то же самое и только что изобрел некоторые объекты данных для управления BindingNavigator, которые затем представляли страницы реальных данных в базе данных. BindingSource может быть задан IListSource в качестве своего DataSource, из которого он затем будет составлять список данных для привязки.
class PageList : System.ComponentModel.IListSource
{
private const int itempagesize = 250;
private long totalitems;
public PageList(string tablename, long totalrecords)
{
this.TableName = tablename;
totalitems = totalrecords;
}
public bool ContainsListCollection { get; protected set; }
public System.Collections.IList GetList()
{
List<ItemPage> pages = new List<ItemPage>();
int totalPages = (int)Math.Ceiling((double)totalitems / (double)itempagesize);
pages.AddRange(Enumerable.Range(0, totalPages).Select(
pageidx => new ItemPage(itempagesize, pageidx * itempagesize)));
return pages;
}
public string TableName { get; protected set; }
public class ItemPage
{
public ItemPage(int limit, int offset)
{
this.Limit = limit;
this.Offset = offset;
}
public readonly int Limit;
public readonly int Offset;
}
}
Итак, у меня есть BindingNavigator, связанный с BindingSource, и когда я хочу
установить общее количество доступных страниц данных, которые я просто делаю:
bsDataPages.DataSource = new PageList(tableName, recordCount);
Затем при использовании навигатора запускается обработчик события источника привязки
private void bsDataPages_CurrentChanged(object sender, EventArgs e)
{
PageList list = bsDataPages.DataSource as PageList;
PageList.ItemPage page = bsDataPages.Current as PageList.ItemPage;
var items = m_datastore.GetTableItems(m_conn,
list.TableName,page.Limit,page.Offset);
}
и я могу пойти и получить эту страницу данных из базы данных.