顯示資料,一般有兩種選擇:ListView和DataGrid,對於後者,其翻頁功能比較容易實現,那麼對於ListView的翻頁呢,似乎不太好實現。痛點主要在於ListView沒有提供翻頁的功能,另外具體的ListView中一頁可以顯示多少資料不好計算,因為一個ListView,如果你顯示的資料不能填充整個ListView,那麼看起來不是很美觀。今天圍繞這兩個問題,我來給出我的做法。
1.計算ListView顯示的最大記錄條數(一頁,無捲軸,對於橫向捲軸未計算在內)
/// <summary>
/// 擷取ListView所能顯示的最大記錄數(無捲軸)
/// </summary>
/// <param name="lv"></param>
/// <returns></returns>
public int GetListViewPageRecordNum(ref ListView lv)
{
int _itemHeight = 0;
if(lv.Items.Count > 0)
_itemHeight = RectangleToClient(lv.Items[0].Bounds).Height;
else
{
lv.Items.Add(new ListViewItem(new string[]{"0","0"})) ;
_itemHeight = RectangleToClient(lv.Items[0].Bounds).Height;
lv.Items.Clear() ;
}
// RECT itemRect = new RECT();
// SendMessage(lv.Handle, (int)HeaderControlMessages.HDM_GETITEMRECT, 0, ref itemRect);
int columnHeaderHeight = 0;//itemRect.bottom - itemRect.top;
// if(columnHeaderHeight == 0)
columnHeaderHeight = _itemHeight*2;//用兩倍資料行的高度作為列名高度
//計算listview最多能夠容納的記錄條數(不顯示捲軸的情況下)
int rnum = (lv.RectangleToClient(new Rectangle(lv.Location.X, lv.Location.Y, lv.Width, lv.Height)).Height - columnHeaderHeight) / _itemHeight ;
return rnum;
}
註:由於ListView的列名(ColumnHeader)部分的高度,我沒有取到,所以用兩倍的Item高度來代替該高度。
2.取到了ListView每一頁顯示的最大記錄數,也就保證了ListView可以“飽滿”的顯示資料,那麼下面做一個ListView的翻頁使用者控制項:ListViewPager。
ListViewPager的屬性:
CurrentPageNum--當前顯示的頁數
MaxPageNum--最大頁數
GoPageNum--當前準備跳轉的頁數
...
ListViewPager的事件:
/// <summary>
/// 上一頁按鈕事件
/// </summary>
[Category("Pager"),Description("上一頁按鈕事件")]
public event PreClickHandle PreButton_Click ;
/// <summary>
/// 第一頁按鈕事件
/// </summary>
[Category("Pager"),Description("第一頁按鈕事件")]
public event FirstClickHandle FirstButton_Click ;
/// <summary>
/// 下一頁按鈕事件
/// </summary>
[Category("Pager"),Description("下一頁按鈕事件")]
public event NextClickHandle NextButton_Click ;
/// <summary>
/// 最後一頁按鈕事件
/// </summary>
[Category("Pager"),Description("最後一頁按鈕事件")]
public event LastClickHandle LastButton_Click ;
/// <summary>
/// 跳到指定頁按鈕事件
/// </summary>
[Category("Pager"),Description("跳到指定頁按鈕事件")]
public event GoToHandle GoButton_Click ;
ListViewPager提供的公用方法:
public void RollBackPage()
public void SetCurrentPage(int page)
public void PerformClickFirstButton()
以上這些是ListViewPager的主要資訊,其實現翻頁主要是在狀態上實現,具體的ListView翻頁資料繫結要由使用者在用戶端實現,具體實現的方法調用,直接放在提供的5個翻頁事件中。在每次綁定資料時,要根據ListViewPager的指定的頁去綁定對應頁的資料,同時,由於每頁記錄數的變化或記錄總數的變化,可能導致總頁數發生變化,那麼在綁定的時候也要指定總頁數,如果一致,則無須指定。
下面是控制項原始碼的下載,沒有提供demo,主要是想給大家提供一個思路,使用也比較簡單,demo過後提供。