原創|其它|編輯:郝浩|2011-09-01 14:27:47.000|閱讀 4498 次
概述: 在Winform開發中,一直離不開分頁處理,好的分頁控件封裝,能為開發節省很多時間和繁瑣工作,對分頁控件一直的改進和完善,也是我的興趣之一。本次主要實現對分頁控件的全面重構,優化功能及界面的處理,并統一完成普通版、基于DotNetbar界面控件版本、DevExpress界面控件版本三大版本的發布,這幾個界面版本,除了界面表現效果不一樣外,所有的功能展示及使用代碼完全一致,保證用戶的知識投資及給客戶良好的使用操作。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在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)
{
BindData();
}
/// <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)
{
BindData();
}
 很多人以前看過我介紹分頁控件的用法的時候,總會覺得上面的數據綁定方式看似簡單,實際操作可能綁定數據總是有問題,因為不知道Find函數里面需要實現那些操作,因為這些是基于我框架的應用邏輯。其實Find方法就是根據分頁屬性計算獲取對應記錄,然后把總記錄數賦值給分頁控件的屬性。
下面我們來介紹一個不需要依賴我的Winform框架類,只是引用微軟EnterpriseLibary數據庫操作類即可完成的操作,因為最新的分頁控件集成了一個基于Oracle、SqlServer、Access、Mysql數據庫的分頁邏輯,只需要使用PagerHelper這個類,傳入相關的參數即可。
分頁控件綁定數據如下代碼所示。
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 =
FindToDataTable(where, this.winGridViewPager1.PagerInfo);
}
FindToDataTable函數的相關實現代碼如下所示:
/// <summary>
/// 標準的記錄查詢函數
/// </summary>
/// <param name="where"></param>
/// <param name="pagerInfo"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 執行SQL查詢語句,返回所有記錄的DataTable集合。
/// </summary>
/// <param name="sql">SQL查詢語句</param>
/// <returns></returns>
public DataTable SqlTable(string sql)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand command = db.GetSqlStringCommand(sql);
return db.ExecuteDataSet(command).Tables[0];
}
利用控件內置的分頁輔助類
WHC.Pager.WinControl.PagerHelper,你就可以不用理會各種不同數據庫的分頁實現邏輯,只需要按照以上的調用方式調用即可,該類傳入的第一個參數,既可以是表名,也可以是一段查詢語句,非常方便各種復雜條件的查詢分頁。
最新分頁控件的相關界面截圖如下所示。
1)設置表格列的可見性
2)表格數據打印預覽
3)行數據基本信息提示
4)復制選定行后在文本中查看
為了使得大家對我的Winform分頁控件在不同情況下的深入了解和使用,我特意編寫了幾種情況下的使用標準例子,供大家下載學習研究,例子包括利用基于泛型模式的Winform開發框架結構的分頁控件使用例子,基于傳統簡單數據綁定的分頁控件使用例子, 基于DotNetBar界面控件及簡單數據綁定的分頁控件使用例子,基于DevExpress界面控件及簡單數據綁定的分頁控件使用例子,如下圖所示。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載