Использование BindingNavigator без BindingSource - PullRequest
3 голосов
/ 07 января 2011

У меня есть приложение, где в базе данных осуществляется пейджинг.То есть вызов для получения списка элементов включает номер страницы, размер страницы и возвращает только данные этих страниц.Например:

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

Я хотел бы использовать Элемент управления BindingNavigator в приложении Windows Forms без указания BindingSource .

Проблема заключается в том, что BindingNavigator будет отображаться как включенный, только если установлен BindingSource.Установка свойства Enabled в true как в конструкторе, так и в коде не соблюдается, и я не могу найти обходной путь или альтернативный stock элемент управления.

Можно ли использовать BindingNavigator таким образом?При необходимости я могу создать пользовательский элемент управления подкачкой, но предпочел бы не делать этого, если мне это не нужно.

Ответы [ 2 ]

6 голосов
/ 14 сентября 2011

Сегодня я попытался сделать то же самое и только что изобрел некоторые объекты данных для управления 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);
    }

и я могу пойти и получить эту страницу данных из базы данных.

3 голосов
/ 10 января 2011

Не было способа переопределить поведение привязки в BindingNavigator, который состоит из ToolStrip и нескольких элементов управления для поддержки навигации.В итоге я скопировал элементы управления из BindingNavigator в новую ToolStrip и добавил туда свою поддержку подкачки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...