我想用ListCtrl如何分页显示数据库内容,比如我想每页显示20条,点下一页或上一页再显示下20条或前20条,该如何写代码?

解决方案 »

  1.   

    以前单位的牛人是重写,派生了一个自己的listctrl实现的
    不过他那个是比较麻烦的,是icon形式的,我估计你这个是report形式的通过操作滚动条来实现上下翻页呢,呵呵
    俺也不知道行不行,没试过
      

  2.   

    为什么一定要listctrl,数据库应该用...
      

  3.   

    显示没有问题,主要是得到想得到的数据。ADO中RecordSet对象中有有关page的属性。研究一下看看。
      

  4.   

    对数据库进行分页,用按钮控制,然后分页显示到LIST上
      

  5.   

    肯定是在滚动条上添加方法
    ADO的_RecordsetPtr具有MoveNext,MoveFirst方法和RecordCount属性,通过这些,应该可以在ListCtrl里动态地加载多少条数据当ListCtrl的控制条到底部时,再点击,就加载多少单位条记录
    关于ListCtrl添加控制条点击函数。找找吧!有的。本人没有实际编过一个像样的VC++程序
      

  6.   

    一般是通过SQL语句的TOP,ORDER BY ,WHERE关键字和主键来实现的给你个示例代码
    //===============================加载BASS281========================================// // 从数据库中获取218设备数量
    if(!CAccessServer::GetRecordCount("BassSeting WHERE strType='281'",nCount))
    {
    return FALSE;
    } // 数据库表的页数:分批加载
    nPageSize = 256;
    if((nCount % nPageSize) == 0)
    {
    nPageCount = nCount / nPageSize;
    }
    else 
    {
    nPageCount = nCount / nPageSize + 1;
    }
    // 从数据库当中加载设备:分页加载
    nPagePosition = 0;
    for (i=0; i<nPageCount; i++)
    {
    strSQL.Format("SELECT TOP %d * FROM BassSeting WHERE (strType='281') AND (dwID > %d) ORDER BY dwID",nPageSize,nPagePosition); // 获取记录
    if(!CAccessServer::GetRecord(strSQL,arrItem))
    {
    continue;
    } // 获取读取的记录数量
    int nCount = arrItem.GetSize();
    if (nCount<=0){
    continue;
    }

    // 提取数据
    for (int k=0; k<nCount; k++)
    {
    ctrlBass281.strIP = arrItem[k].strIP;
    ctrlBass281.wSendPort = arrItem[k].wSendPort;
    ctrlBass281.wRecvPort = arrItem[k].wRecvPort; // 添加元素
    if(!AddBass281(ctrlBass281))
    {
    continue;
    } // 保存到缓冲区:提供后续的路径树型控件初始化使用
    CBassTreeArray::SetItem(arrItem[k]);
    }

    nPagePosition = arrItem[nCount-1].dwID;
    }
      

  7.   

    根据数据记录总数和list可显示的行数,算出总的页数,移动list时,根据顶行的索引号,算出所对应该的页号,余下的工作就是根据页号从数据库中取出每页的记录而已