在Web中,以前寫過相關的分頁控件的實例教程,如: 分頁控件 實戰 Post篇 (包源碼的)
在Winform中,分頁有時候也是必不可少的一項,因此, 新手Mark一下有時候是必要的。
下面開始簡單介紹一下:
既然是分頁控件,說明它是個控件,因此,繼承控件繼承自用戶控件如下:
{
#region 構造函數
public PagerControl()
{
InitializeComponent();
}
}
然后就是對界面拉一些控件了,如下圖:
各個控件的ID就不一個個打了,下面的代碼看名稱就知道了。
按下來定義幾個屬性(第幾頁,每頁幾條,記錄總數,這幾個是國際性慣例必須的)
{
#region 構造函數
public PagerControl()
{
InitializeComponent();
}
#endregion
#region 分頁字段和屬性
private int pageIndex = 1;
/// <summary>
/// 當前頁面
/// </summary>
public virtual int PageIndex
{
get { return pageIndex; }
set { pageIndex = value; }
}
private int pageSize = 100;
/// <summary>
/// 每頁記錄數
/// </summary>
public virtual int PageSize
{
get { return pageSize; }
set { pageSize = value; }
}
private int recordCount = 0;
/// <summary>
/// 總記錄數
/// </summary>
public virtual int RecordCount
{
get { return recordCount; }
set { recordCount = value; }
}
private int pageCount = 0;
/// <summary>
/// 總頁數
/// </summary>
public int PageCount
{
get
{
if (pageSize != 0)
{
pageCount = GetPageCount();
}
return pageCount;
}
}
}
上面順帶多了一個計算頁總數的代碼。
接着定義一個事件,用於在引發分頁時,方便外部重新獲取數據綁定:
public event EventHandler OnPageChanged;
再往下就是點擊按鈕的分頁和引發的控件重繪了:
看“首頁,上一頁,下一頁,尾頁”事件:
{
PageIndex = 1;
DrawControl( true);
}
private void lnkPrev_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e)
{
PageIndex = Math.Max( 1, PageIndex - 1);
DrawControl( true);
}
private void lnkNext_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e)
{
PageIndex = Math.Min(PageCount, PageIndex + 1);
DrawControl( true);
}
private void lnkLast_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e)
{
PageIndex = PageCount;
DrawControl( true);
}
代碼是在分頁類里,這里就不重復再寫上面的寫過的代碼了。
然后是重繪控件的代碼:
/// 外部調用
/// </summary>
public void DrawControl( int count)
{
recordCount = count;
DrawControl( false);
}
/// <summary>
/// 頁面控件呈現
/// </summary>
private void DrawControl( bool callEvent)
{
btnGo.Text = JumpText;
lblCurrentPage.Text = PageIndex.ToString();
lblPageCount.Text = PageCount.ToString();
lblTotalCount.Text = RecordCount.ToString();
txtPageSize.Text = PageSize.ToString();
if (callEvent && OnPageChanged != null)
{
OnPageChanged( this, null); // 當前分頁數字改變時,觸發委托事件
}
SetFormCtrEnabled();
if (PageCount == 1) // 有且僅有一頁
{
lnkFirst.Enabled = false;
lnkPrev.Enabled = false;
lnkNext.Enabled = false;
lnkLast.Enabled = false;
btnGo.Enabled = false;
}
else if (PageIndex == 1) // 第一頁
{
lnkFirst.Enabled = false;
lnkPrev.Enabled = false;
}
else if (PageIndex == PageCount) // 最后一頁
{
lnkNext.Enabled = false;
lnkLast.Enabled = false;
}
}
private void SetFormCtrEnabled()
{
lnkFirst.Enabled = true;
lnkPrev.Enabled = true;
lnkNext.Enabled = true;
lnkLast.Enabled = true;
btnGo.Enabled = true;
}
OK,分頁的代碼基本就完了,為了提升一點小用戶體驗,包括改變分頁大小,或在輸入跳轉頁后按加車也能執行事件,這里加多一點處理代碼:
/// enter鍵功能
/// </summary>
private void txtPageNum_KeyPress( object sender, KeyPressEventArgs e)
{
btnGo_Click( null, null);
}
/// <summary>
/// 跳轉頁數限制
/// </summary>
private void txtPageNum_TextChanged( object sender, EventArgs e)
{
int num = 0;
if ( int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
{
if (num > PageCount)
{
txtPageNum.Text = PageCount.ToString();
}
}
}
/// <summary>
/// 跳轉
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGo_Click( object sender, EventArgs e)
{
int num = 0;
if ( int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
{
PageIndex = num;
DrawControl( true);
}
}
#endregion
bool isTextChanged = false;
/// <summary>
/// 分頁屬性改變了。
/// </summary>
private void txtPageSize_TextChanged( object sender, EventArgs e)
{
int num = 0;
if (! int.TryParse(txtPageSize.Text.Trim(), out num) || num <= 0)
{
num = 100;
txtPageSize.Text = " 100 ";
}
else
{
isTextChanged = true;
}
pageSize = num;
}
/// <summary>
/// 光標離開分頁屬性
private void txtPageSize_Leave( object sender, EventArgs e)
{
if (isTextChanged)
{
isTextChanged = false;
lnkFirst_LinkClicked( null, null);
}
}
到這里,分頁的源碼就寫完了,各位自己有空也多寫寫,就那么幾個事件和步驟。
控件出來了,接下就是弄個簡單的界面示例意思意思一下,然后提供下源碼了。
新建winform項目、往里拖一個DataGridView+剛才的分頁控件,如下圖:
接下來是winform的測試代碼,這里引用CYQ.Data操作文本數據庫進行簡單示例:
{
// 創建文件數據庫表。
MDataTable.CreateSchema( " Users.txt ", false, new string[] { " UserName ", " Password ", " Enabled " }, SqlDbType.NVarChar, SqlDbType.NVarChar, SqlDbType.Bit);
for ( int i = 0; i < 200; i++) // 插入200條數據。
{
using (MAction action = new MAction( " Users.txt ", " Txt Path={0} "))
{
action.Set( " UserName ", " UserName_ " + i);
action.Set( " Password ", " Password_ " + i);
action.Set( " Enabled ", i% 2== 0);
action.Insert(InsertOp.None);
}
}
pagerControl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged);
LoadData();
}
void pagerControl1_OnPageChanged( object sender, EventArgs e)
{
LoadData();
}
void LoadData()
{
int count;
using (MAction action = new MAction( " Users.txt ", " Txt Path={0} "))
{
action.Select(pagerControl1.PageIndex, pagerControl1.PageSize, string.Empty, out count).Bind(gvUsers);
pagerControl1.DrawControl(count);
}
}
代碼很簡單,重點在
pagerControl1.OnPageChanged事件里調用LoadData來綁定數據,重繪分布控件時調用
pagerControl1.DrawControl(傳進記錄總數);
於是數據出來了,效果如下圖:
源碼打包下載: winform 分頁控件源碼