天天看點

c# winform制作簡單分頁控件

效果如圖:

c# winform制作簡單分頁控件

首先在項目中添加使用者控件:

c# winform制作簡單分頁控件

使用者控件中添加屬性和系統方法,則會在控制台中可以更改屬性和添加控件事件,分頁控件這裡定義兩個屬性,每頁顯示記錄數和目前頁數,當改變目前頁數時,将觸發事件,代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Controls;
using System.Data.SqlClient;

namespace BaseForm.UserControls
{
    public partial class PageBar : UserControl
    {
        public event EventHandler PageChanged; //事件:控件的目前頁碼發生變更。

        /// <summary>
        /// PageBar分頁控件所關聯的DataGridView資料控件,當PageBar分頁控件執行DataBind()資料綁定
        /// 方法時,PageBar分頁控件會自動将分頁後的資料,綁定給關聯的DataGridView控件進行顯示。
        /// </summary>
        public DataGridViewX DataControl  //這裡因為使用了第三方界面控件DotNetBar, 是以為DataGridViewX
        {
            get;
            set;
        }

        /// <summary>
        /// PageBar分頁控件的資料源,資料源為資料實體層中所定義的PageData類型。
        /// </summary>
        public  PageData DataSource
        {
            get;
            set;
        }

        /// <summary>
        /// 控件執行個體化方法
        /// </summary>
        public PageBar()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 進行資料綁定,将資料源中的IList類型資料,綁定給關聯的資料控件進行顯示。
        /// </summary>
        public void DataBind()
        {
            if (DataSource == null) return;
            labNumber.Text= "共" + DataSource.RecordCount.ToString() + "條記錄,每頁" + DataSource.PageSize.ToString() + "條,共"+DataSource.PageCount.ToString()+"頁";//為使用者控件的Label指派
            txtCurPage.Text= DataSource.CurPage.ToString();//目前頁數
            DataControl.AutoGenerateColumns = false;
            DataControl.DataSource = DataSource.PageList.Tables[0].DefaultView;//綁定DataGridiew
        }

        /// <summary>
        /// 使用者單擊“首頁”按鈕時的事件處理方法。
        /// </summary>
        private void btnFirstPage_Click(object sender, EventArgs e)
        {
            CurPage = 1;
        }

        /// <summary>
        /// 使用者單擊“上一頁”按鈕時的事件處理方法。
        /// </summary>
        private void btnPrePage_Click(object sender, EventArgs e)
        {
            CurPage = DataSource.PrevPage;
        }

        /// <summary>
        /// 使用者單擊“下一頁”按鈕時的事件處理方法。
        /// </summary>
        private void btnNextPage_Click(object sender, EventArgs e)
        {
            CurPage = DataSource.NextPage;
        }

        /// <summary>
        /// 使用者單擊“最後一頁”按鈕時的事件處理方法。
        /// </summary>
        private void btnLastPage_Click(object sender, EventArgs e)
        {
            CurPage = DataSource.PageCount;
        }

        #region PageBar控件的相關變量及屬性定義

        private int pageSize;
        private int curPage;

        /// <summary>
        /// 每頁顯示記錄數。
        /// </summary>
        public int PageSize
        {
            get
            {
                if (pageSize <= 0)
                {
                    pageSize = 10;
                }
                return pageSize;
            }
            set
            {
                pageSize = value;
            }
        }

        /// <summary>
        /// 目前頁數
        /// </summary>
        public int CurPage
        {
            get
            {
                if (curPage <= 0)
                {
                    curPage = 1;
                }
                return curPage;
            }
            set
            {
                curPage = value;
                if (PageChanged != null)
                {
                    PageChanged(this, null);//觸發當件頁碼變更事件。
                }
            }
        }
        #endregion
    }
}
           

PageData類是使用者控件需要指派的一些屬性,即資料實體層,代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data;

namespace BaseForm.UserControls
{
    /// <summary>
    /// 對象名稱:資料分頁實體類(資料實體層)
    /// 對象說明:主要用于資料通路層與使用者界面層中的PageBar分頁控件進行資料互動。   
    /// </summary>
    public class PageData
    {
        /// <summary>
        /// [屬性]分頁過後的資料。
        /// </summary>
        public DataSet PageList
        {
            get;
            set;
        }

        /// <summary>
        /// [屬性]每頁顯示記錄數。
        /// </summary>
        public int PageSize
        {
            get;
            set;
        }

        /// <summary>
        /// [屬性]所請求的目前頁數。
        /// </summary>
        public int CurPage
        {
            get;
            set;
        }

        /// <summary>
        /// [屬性]總頁數。
        /// </summary>
        public int PageCount
        {
            get;
            set;
        }

        /// <summary>
        /// [屬性]總記錄數。
        /// </summary>
        public int RecordCount
        {
            get;
            set;
        }

        /// <summary>
        /// [屬性]相對于目前頁的上一頁
        /// </summary>
        public int PrevPage
        {
            get
            {
                if (CurPage > 1)
                {
                    return CurPage - 1;
                }
                return 1;
            }
        }

        /// <summary>
        /// [屬性]相對于目前頁的下一頁
        /// </summary>
        public int NextPage
        {
            get
            {
                if (CurPage < PageCount)
                {
                    return CurPage + 1;
                }
                return PageCount;
            }
        }
    }
}
           

下面是資料通路層代碼:

/// <summary>
        /// 傳回資料清單
        /// </summary>
        /// <param name="intSta">起始位置</param>
        /// <param name="intNum">資料個數</param>      
        public DataSet GetList(int intSta, int intNum)
        {
            using (SqlConnection sqlConnection = GetNewConnection())
            {

                string sqlText = "select * from [OfficeRibbon] order by id desc";
                SqlDataAdapter adapter = new SqlDataAdapter(sqlText, sqlConnection);
                DataSet dataset = new DataSet();
                adapter.Fill(dataset, intSta, intNum, "datasource");
                return dataset;
            }
        }

        /// <summary>
        /// 傳回分頁資料
        /// </summary>
        public PageData GetPageList(int pageSize, int curPage)
        {                                
            PageData pageData = new PageData();
            pageData.PageSize = pageSize;
            pageData.CurPage = curPage;
            pageData.RecordCount = ExecuteScalar();
            pageData.PageCount = 1;
            if (pageData.RecordCount > 0)
            pageData.PageCount = Convert.ToInt32(Math.Ceiling((double)pageData.RecordCount / (double)pageSize));
            pageData.PageList = GetList((curPage - 1) * pageSize, pageSize);
            return pageData;
        }
           

然後編譯生成,在工具箱裡就出現了使用者控件,我們可以直接拖一個DatagridView控件和PageBar使用者控件在窗體上引用的代碼為:

public partial class EditFrm : Office2007Form
    {        
        public EditFrm()
        {          
            InitializeComponent();
            BindDataGrid();
        }

        /// <summary>
        /// 對DataGridView控件的資料源進行綁定。
        /// </summary>
        public void BindDataGrid()
        {
            OfficeRibbonBLL officeRibbonBll = new OfficeRibbonBLL();
            pageBar1.DataControl = dataGridView;          
            pageBar1.DataSource = officeRibbonBll.GetPageList(pageBar1.PageSize,pageBar1.CurPage);
            pageBar1.DataBind();
                    
        }

        private void pageBar1_PageChanged(object sender, EventArgs e)
        {
            BindDataGrid(); //重新對DataGridView控件的資料源進行綁定。
        }
    }