2011-01-07 8 views
3

データベース内でページングが行われるアプリケーションがあります。つまり、アイテムのリストを取得する呼び出しには、ページ番号とページサイズが含まれ、そのページのデータのみが返されます。たとえば:BindingSourceなしでBindingNavigatorを使用する

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

私はBindingSourceを指定せずにWindowsフォームアプリケーションでBindingNavigator Control UIを使用したいと思います。

BindingNavigatorは、BindingSourceが設定されている場合にのみ有効にレンダリングされます。デザイナとコードの両方でEnabledプロパティをtrueに設定することは尊重されず、回避策や代替を見つけることができませんコントロール。

このようにBindingNavigatorを使用することはできますか?必要に応じてカスタムページングコントロールを作成することはできますが、必要がない場合は使用しないことをお勧めします。

答えて

3

BindingNavigatorのバインディング動作をオーバーライドする方法はありませんでした.BindingNavigatorは、ToolStripとナビゲーションをサポートするいくつかのコントロールで構成されています。 BindingNavigatorのコントロールを新しいToolStripにコピーして、そこでページングのサポートを追加しました。

6

今日も同様のことをやろうとしていましたが、BindingNavigatorがデータベース内の実際のデータのページをどのように表していたかを管理するデータオブジェクトをいくつか発明しました。 BindingSourceにはDataSourceとしてIListSourceを渡すことができ、そこからバインドするデータのリストを描画します。

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

私は行って、そのデータページをデータベースから取得できます。

関連する問題