天天看點

Winform分頁控件重大更新,并實作普通版、DotNetBar、DevExpress三大版本整合更新(附各種例子源碼)

在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界面控件及簡單資料綁定的分頁控件使用例子,如下圖所示。