在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);
}