我有一个在数据库中完成分页的应用程序。也就是说,检索项目列表的调用包括页码、页面大小,并且将仅返回该页面的数据。例如:

ItemCollection items = ListAllItems(1, 20); // page 1, show 20 items per page

ItemCollection 包括一个 PagingUtil 属性,该属性是一个包含支持分页而不检索所有记录的属性的类。
public class PagingUtil
{
    public int StartRow { get; private set; }

    public int EndRow { get; private set; }

    public int TotalPages { get; private set; }

    public bool HasPrevPage { get; private set; }

    public bool HasNextPage { get; private set; }

    public int TotalCount { get; private set; }

    private PagingUtil() {}

    public PagingUtil(int pageNumber, int visiblePerPage, int totalCount)
    {
            ... logic for setting property values here ...
        }
    }

我想在 Windows 窗体应用程序中使用 BindingNavigator Control UI 而不必指定 BindingSource

问题是,如果设置了 BindingSource,则 BindingNavigator 只会呈现为启用状态。在设计器和代码中将 Enabled 属性设置为 true 不受尊重,我似乎找不到解决方法或替代 股票 控件。

可以这样使用 BindingNavigator 吗?如果需要,我可以创建自定义分页控件,但如果我不需要,我宁愿不要。

最佳答案

我今天尝试做类似的事情,结果只是发明了一些数据对象供 BindingNavigator 管理,然后代表数据库中实际数据的页面。可以给 BindingSource 一个 IListSource 作为它的 DataSource,然后它会从中绘制要绑定(bind)的数据列表。

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;
    }
}

所以我有一个绑定(bind)到 BindingSource 的 BindingNavigator,当我想
设置可用数据页的总数我只是做了一个:
bsDataPages.DataSource = new PageList(tableName, recordCount);

然后在使用导航器时触发绑定(bind)源事件处理程序
    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);
    }

我可以去从数据库中获取那页数据。

关于c# - 在没有 BindingSource 的情况下使用 BindingNavigator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4629160/

10-11 01:53