在Winform開發中,一直離不開分頁處理,好的分頁控件封裝,能為開發節省很多時間和繁瑣工作,對分頁控件一直的改進和完善,也是我的興趣之一。本次主要實作對分頁控件的全面重構,優化功能及界面的處理,并統一完成普通版、基于DotNetbar界面控件版本、DevExpress界面控件版本三大版本的釋出,這幾個界面版本,除了界面表現效果不一樣外,所有的功能展示及使用代碼完全一緻,保證使用者的知識投資及給客戶良好的使用操作。本次主要增加的功能有:可通過界面設定清單顯示的列,可複制標明的行資訊,可設定顯示的行号、可設定顯示間隔行的顔色等功能。下面分别對幾個例子的截圖進行總體介紹,然後在詳細介紹
1)普通版(即不引用任何第三方界面控件)效果圖
上圖中,紅色的菜單是分頁控件内置的菜單項,其他程式附加是擴充菜單項目,其中複制標明行資訊、設定表格顯示列、列印清單是對表格基本的操作功能。下面兩個版本的控件右鍵菜單均表現一緻。
2) 基于DotNetbar界面控件版本
3) 基于DevExpress界面控件版本
使用分頁控件的基礎代碼,在所有以上版本中,代碼均一緻,隻是一些特殊的操作,需要利用到不同的控件,有所差異而已。初始化分頁控件代碼如下所示。
private void FrmCustomer_Load(object sender, EventArgs e)
{
this.winGridViewPager1.ProgressBar = this.toolStripProgressBar1.ProgressBar;
this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);
this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);
this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected);
this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);
this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;//追加額外菜單項目
this.winGridViewPager1.ShowLineNumber = true;//顯示行号
this.winGridViewPager1.PagerInfo.PageSize = 30;//頁面大小
this.winGridViewPager1.EventRowBackColor = Color.LightCyan;//間隔顔色
BindData();
}
以上是對分頁控件的相關事件進行處理,如果實作了相關的事件,那麼相應的菜單(如新增、編輯、删除等)就會在右鍵菜單中出現,否則不會出現,相應的事件就是具體對應操作的處理菜單操作。另外,分頁控件的一些屬性,如是否顯示行号、頁面顯示記錄大小、間隔顔色等屬性也可以在這裡設定。
這些初始化設定完成後,一般查詢界面都會有一個條件的組合,然後通過組合條件查詢資料庫記錄并顯示,顯示的時候,分頁控件可以設定對應字段的中文顯示名稱,顯示的字段列,顯示順序等。顯示字段的順序就是清單的顯示順序,這個特性也是新版本增加的功能之一。
private void winGridViewPager1_OnPageChanged(object sender, EventArgs e)
{
}
/// <summary>
/// 根據查詢條件構造查詢語句
/// </summary>
/// <returns></returns>
private string GetSearchSql()
SearchCondition condition = new SearchCondition();
condition.AddCondition("Number", this.txtNumber.Text, SqlOperator.Like)
.AddCondition("Name", this.txtName.Text, SqlOperator.Like)
.AddCondition("Type", this.cmbType.Text, SqlOperator.Like)
.AddCondition("Area", this.cmbArea.Text, SqlOperator.Like)
.AddCondition("Address", this.txtAddress.Text, SqlOperator.Like)
.AddCondition("Company", this.txtCompany.Text, SqlOperator.Like)
.AddCondition("Note", this.txtNote.Text, SqlOperator.Like)
.AddCondition("Telephone1", this.txtTelephone.Text, SqlOperator.Like, true, "Telephone")
.AddCondition("Telephone2", this.txtTelephone.Text, SqlOperator.Like, true, "Telephone")
.AddCondition("Telephone3", this.txtTelephone.Text, SqlOperator.Like, true, "Telephone")
.AddCondition("Telephone4", this.txtTelephone.Text, SqlOperator.Like, true, "Telephone")
.AddCondition("Telephone5", this.txtTelephone.Text, SqlOperator.Like, true, "Telephone");
if (chkUseDate.Checked)
{
condition.AddCondition("CreateDate", dateTimePicker1.Value.ToString("yyyy-MM-dd"), SqlOperator.MoreThanOrEqual, true)
.AddCondition("CreateDate", dateTimePicker2.Value.AddDays(1).ToString("yyyy-MM-dd"), SqlOperator.LessThanOrEqual, true);
}
string where = condition.BuildConditionSql().Replace("Where", "");
return where;
private void BindData()
#region 添加别名解析
//DisplayColumns與顯示的字段名或者實體屬性一緻,大小寫不敏感,順序代表顯示順序,用逗号或者|分開
this.winGridViewPager1.DisplayColumns = "Number,NAME,type,Area,Company,Address,Telephone1,Telephone2,Telephone3,Telephone4,Telephone5,CreateDate,Note,LastUpdated";
this.winGridViewPager1.AddColumnAlias("ID", "編号");
this.winGridViewPager1.AddColumnAlias("Number", "客戶編号");
this.winGridViewPager1.AddColumnAlias("Name", "客戶名稱");
this.winGridViewPager1.AddColumnAlias("Type", "客戶類型");
this.winGridViewPager1.AddColumnAlias("Area", "客戶地區");
this.winGridViewPager1.AddColumnAlias("Company", "客戶機關");
this.winGridViewPager1.AddColumnAlias("Address", "客戶位址");
this.winGridViewPager1.AddColumnAlias("Telephone1", "電話1");
this.winGridViewPager1.AddColumnAlias("Telephone2", "電話2");
this.winGridViewPager1.AddColumnAlias("Telephone3", "電話3");
this.winGridViewPager1.AddColumnAlias("Telephone4", "電話4");
this.winGridViewPager1.AddColumnAlias("Telephone5", "電話5");
this.winGridViewPager1.AddColumnAlias("CreateDate", "開戶日期");
this.winGridViewPager1.AddColumnAlias("Shop_ID", "分店ID");
this.winGridViewPager1.AddColumnAlias("Note", "備注");
this.winGridViewPager1.AddColumnAlias("LastUpdated", "更新日期");
#endregion
string where = GetSearchSql();
this.winGridViewPager1.DataSource = BLLFactory<Customer>.Instance.Find(where, this.winGridViewPager1.PagerInfo);
private void btnSearch_Click(object sender, EventArgs e)
很多人以前看過我介紹分頁控件的用法的時候,總會覺得上面的資料綁定方式看似簡單,實際操作可能綁定資料總是有問題,因為不知道Find函數裡面需要實作那些操作,因為這些是基于我架構的應用邏輯。其實Find方法就是根據分頁屬性計算擷取對應記錄,然後把總記錄數指派給分頁控件的屬性。
下面我們來介紹一個不需要依賴我的Winform架構類,隻是引用微軟EnterpriseLibary資料庫操作類即可完成的操作,因為最新的分頁控件內建了一個基于Oracle、SqlServer、Access、Mysql資料庫的分頁邏輯,隻需要使用PagerHelper這個類,傳入相關的參數即可。
分頁控件綁定資料如下代碼所示。
private void BindData()
this.winGridViewPager1.DataSource = FindToDataTable(where, this.winGridViewPager1.PagerInfo);
}
FindToDataTable函數的相關實作代碼如下所示:
/// <summary>
/// 标準的記錄查詢函數
/// <param name="where"></param>
/// <param name="pagerInfo"></param>
private DataTable FindToDataTable(string where, PagerInfo pagerInfo)
WHC.Pager.WinControl.PagerHelper helper = new WHC.Pager.WinControl.PagerHelper("All_Customer", "*", "LastUpdated", pagerInfo.PageSize, pagerInfo.CurrenetPageIndex, true, where);
string countSql = helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.Access, true);
string dataSql = helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.Access, false);
string value = SqlValueList(countSql);
pagerInfo.RecordCount = Convert.ToInt32(value);//為了顯示具體的資訊,需要設定總記錄數
DataTable dt = SqlTable(dataSql);
return dt;
/// <summary>
/// 執行SQL查詢語句,傳回查詢結果的所有記錄的第一個字段,用逗号分隔。
/// </summary>
/// <param name="sql">SQL語句</param>
/// <returns>
/// 傳回查詢結果的所有記錄的第一個字段,用逗号分隔。
/// </returns>
public string SqlValueList(string sql)
StringBuilder result = new StringBuilder();
Database db = DatabaseFactory.CreateDatabase();
DbCommand command = db.GetSqlStringCommand(sql);
using (IDataReader dr = db.ExecuteReader(command))
while (dr.Read())
{
result.AppendFormat("{0},", dr[0].ToString());
}
string strResult = result.ToString().Trim(',');
return strResult;
/// 執行SQL查詢語句,傳回所有記錄的DataTable集合。
/// <param name="sql">SQL查詢語句</param>
/// <returns></returns>
public DataTable SqlTable(string sql)
return db.ExecuteDataSet(command).Tables[0];
}
利用控件内置的分頁輔助類
WHC.Pager.WinControl.PagerHelper,你就可以不用理會各種不同資料庫的分頁實作邏輯,隻需要按照以上的調用方式調用即可,該類傳入的第一個參數,既可以是表名,也可以是一段查詢語句,非常友善各種複雜條件的查詢分頁。
最新分頁控件的相關界面截圖如下所示。
1)設定表格列的可見性
2)表格資料列印預覽
3)行資料基本資訊提示
4)複制標明行後在文本中檢視
為了使得大家對我的Winform分頁控件在不同情況下的深入了解和使用,我特意編寫了幾種情況下的使用标準例子,供大家下載下傳學習研究,例子包括利用基于泛型模式的Winform開發架構結構的分頁控件使用例子,基于傳統簡單資料綁定的分頁控件使用例子, 基于DotNetBar界面控件及簡單資料綁定的分頁控件使用例子,基于DevExpress界面控件及簡單資料綁定的分頁控件使用例子,如下圖所示。