VC中通过动态读取数据库中数据集显示在ListView中且将将数据字段作为表头

       在Visual C++中我们经常会遇到数据管理问题,其中数据管理问题中典型的问题就是将数据库中的数据查找出来,然后显示出来,CLIstView和CListCtrl在VC中是常用到列表式的数据显示中组件,但是我们在使用ADO访问数据后,很难将数据库中的字段作为列表头帮定到列表控件或列表示图中,前段时间做了一个自动报表的东东,做了许多尝试,最终得以解决,虽然用到了复杂的数据转换,牺牲一些效率,但也不失为一种解决方法,其主要代码如下:

 

void CListViewEx1::OnInitialUpdate()
{
 CListView::OnInitialUpdate();
 LV_COLUMN lvc;
 LV_ITEM lvitem;
 lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH;
 _variant_t tempName;
 char m_sztemp[250];
 for(long i=0;i<pRs->GetFields()->Count;i++)
 {
       lvc.iSubItem=i;
       tempName=pRs->Fields->GetItem((long)i)->GetName();
       WideCharToMultiByte(CP_ACP,0,tempName.bstrVal,-1,m_sztemp,sizeof(m_sztemp),NULL,NULL);
       lvc.pszText=m_sztemp;
       lvc.cx=100;
       GetListCtrl().InsertColumn(i,&lvc);
 }//以上内容填加了列表的头.最上面的一层Header
 CString str;
 int iItem=0;
 _variant_t temp;
 while(pRs->BOF==pRs->DEOF)
 {
  for(int iSubItem=0;iSubItem<pRs->GetFields()->Count;iSubItem++)
  {
         lvitem.mask=LVIF_TEXT;
         lvitem.iItem=iItem;
         lvitem.iSubItem=iSubItem;
         temp=pRs->GetFields()->GetItem((long)iSubItem)->Value;
         WideCharToMultiByte(CP_ACP,0,temp.bstrVal,-1,m_sztemp,sizeof(m_sztemp),NULL,NULL);
         lvitem.pszText=m_sztemp;
         if(iSubItem==0)//这个if语句非常重要,当插入一个新行时,使用InsertItem,当在这一行上插入新列时,使用SetItem;
              this->GetListCtrl().InsertItem(&lvitem);
         else
    this->GetListCtrl().SetItem(&lvitem);
  }
  pRs->MoveNext();
  iItem++;
 }
 this->GetListCtrl().SetExtendedStyle  (LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_TRACKSELECT);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值