现在的位置: 首页 > 综合 > 正文

ListView大数据显示翻页处理方法

2012年07月13日 ⁄ 综合 ⁄ 共 2348字 ⁄ 字号 评论关闭
显示数据,一般有两种选择: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过后提供。

抱歉!评论已关闭.