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过后提供。