傳統的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實時加載資料的功能開發出來了
分享給大家
歡迎讨論
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<T> where T: new()
{
//一頁有多少條資料
private int page_size = 30;
public int PageSize
{
get { return page_size; }
}
/// <summary>
/// 過濾條件
/// </summary>
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<T> data_list = new List<T>();
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下拉事件
/// <param name="sender"></param>
/// <param name="e"></param>
void grid_TopRowChanged(object sender, EventArgs e)
GridView grid = sender as GridView;
if (grid.TopRowIndex >= (page_num - 1) * page_size)
{
//當看完一頁資料的時候開始取資料
page_num++;
List<T> test = GetData();
data_list.InsertRange((page_num - 1)* page_size, test);
}
/// 實時的加載資料函數
/// <returns></returns>
public List<T> GetData()
return Proxy.GetDataList(this.Filter, this.OrderBy, this.page_size,this.page_num, ref this.row_count) as List<T>;
}
}
T泛型限制是需要加載資料的類型
BaseProxy是通路資料庫的基類,其中包含GetDataList的虛方法
繼承自BaseProxy的GetDataList為
public override object GetDataList(string filter, string order_by, int page_size, int page_num, ref int count)
count = 1000;
List<RegionEntity> regions = new List<RegionEntity>();
for (int i = 0; i < page_size; i++)
regions.Add(new RegionEntity() { SR_RegionName = ((page_num-1)*page_size+i).ToString() });
return regions;
這裡的RegionEntity就是前面提到的某一種類型的T
資料提供程式是模拟出來的(測試驅動開發,哈哈)
你可以在這個函數裡寫資料庫通路方法
具體調用方法如下
GridCreator<RegionEntity> creator = new GridCreator<RegionEntity>(gridShop,new UtilsProxy());
UtilsProxy類繼承自BaseProxy并重寫了GetDataList方法
gridShop就是目前窗體的DevExpress.XtraGrid.GridControl控件
RegionEntity針對泛型類型
用起來還是蠻友善的
2009.12.14夜做代碼包如下:
代碼包中包含顯示datatable資料的工具方法
并公布了我的資料通路層