天天看點

DevExpress的GridControl的實時加載資料解決方案(取代分頁)

傳統的Winform(不使用第三方控件)針對DataGridView的實時加載資料的文章請看這裡

<a href="http://www.cnblogs.com/liulun/archive/2009/09/28/1576000.html">http://www.cnblogs.com/liulun/archive/2009/09/28/1576000.html</a>

DevExpress是一套第三方控件

其中有類似DataGridView的控件

今天把針對DevExpress.XtraGrid.GridControl實時加載資料的功能開發出來了

分享給大家

歡迎讨論

DevExpress的GridControl的實時加載資料解決方案(取代分頁)
DevExpress的GridControl的實時加載資料解決方案(取代分頁)

Code

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using DevExpress.XtraGrid;

using DevExpress.XtraGrid.Views.Grid;

namespace Life365.CallCenter

{

    public class GridCreator&lt;T&gt; where T: new()

    {

        //一頁有多少條資料

        private int page_size = 30;

        public int PageSize

        {

            get { return page_size; }

        }

        /// &lt;summary&gt;

        /// 過濾條件

        /// &lt;/summary&gt;

        public string Filter

            get;

            set;

        /// 排序條件

        public string OrderBy

        /// 資料通路類

        public BaseProxy Proxy

        private int row_count;

        /// 總行數

        public int RowCount

            get {return row_count;}

        private int page_num = 1;

        /// 目前的資料頁

        public int PageNum

            get { return page_num; }

        //緩存的資料

        private List&lt;T&gt; data_list = new List&lt;T&gt;();

        private GridCreator()

        { 

        /// 構造函數

        public GridCreator(GridControl grid,BaseProxy proxy)

            ((GridView)grid.MainView).TopRowChanged += new EventHandler(grid_TopRowChanged);

            this.Proxy = proxy;

            grid.DataSource = data_list;

        /// 擷取前兩頁資料

        private void GetTwoPageData()

            data_list.InsertRange(0, GetData());

            page_num++;

            data_list.InsertRange(page_size, GetData());

        }        

        /// grid下拉事件

        /// &lt;param name="sender"&gt;&lt;/param&gt;

        /// &lt;param name="e"&gt;&lt;/param&gt;

        void grid_TopRowChanged(object sender, EventArgs e)

            GridView grid = sender as GridView;

            if (grid.TopRowIndex &gt;= (page_num - 1) * page_size)

            {

                //當看完一頁資料的時候開始取資料

                page_num++;

                List&lt;T&gt; test = GetData();

                data_list.InsertRange((page_num - 1)* page_size, test);

            }

        /// 實時的加載資料函數

        /// &lt;returns&gt;&lt;/returns&gt;

        public List&lt;T&gt; GetData()

            return Proxy.GetDataList(this.Filter, this.OrderBy, this.page_size,this.page_num, ref this.row_count) as List&lt;T&gt;;

    }

}

T泛型限制是需要加載資料的類型

BaseProxy是通路資料庫的基類,其中包含GetDataList的虛方法

繼承自BaseProxy的GetDataList為

DevExpress的GridControl的實時加載資料解決方案(取代分頁)
DevExpress的GridControl的實時加載資料解決方案(取代分頁)

        public override object GetDataList(string filter, string order_by, int page_size, int page_num, ref int count)

            count = 1000;

            List&lt;RegionEntity&gt; regions = new List&lt;RegionEntity&gt;();

            for (int i = 0; i &lt; page_size; i++)

                regions.Add(new RegionEntity() { SR_RegionName = ((page_num-1)*page_size+i).ToString() });

            return regions;

這裡的RegionEntity就是前面提到的某一種類型的T

資料提供程式是模拟出來的(測試驅動開發,哈哈)

你可以在這個函數裡寫資料庫通路方法

具體調用方法如下

DevExpress的GridControl的實時加載資料解決方案(取代分頁)
DevExpress的GridControl的實時加載資料解決方案(取代分頁)

GridCreator&lt;RegionEntity&gt; creator = new GridCreator&lt;RegionEntity&gt;(gridShop,new UtilsProxy());

UtilsProxy類繼承自BaseProxy并重寫了GetDataList方法

gridShop就是目前窗體的DevExpress.XtraGrid.GridControl控件

RegionEntity針對泛型類型

用起來還是蠻友善的

2009.12.14夜做代碼包如下:

代碼包中包含顯示datatable資料的工具方法

并公布了我的資料通路層