void CDianDlg::OnCbnSelchangeCombo1()
{
if (!m_ado.Select(_T("SELECT * FROM t_Maxblank")))
return;
m_list2.DeleteAllItems();
UINT nNumb = 0;
CString str, str1;
int i = 0;
int index = m_CombBoChang.GetCurSel();
m_CombBoChang.GetLBText(index, str);
if (str == "340")
{
m_list2.InsertColumn(1, _T("波长340"), LVCFMT_CENTER, 100);
while (!m_ado.IsEOF())
{
m_ado.GetFieldByIndex(0, nNumb ); //ID
str1.Format(_T("%d"), nNumb );
m_list2.InsertItem(i, str1);
m_ado.GetFieldByIndex(1, nNumb); // 340
str1.Format(_T("%d"), nNumb);
m_list2.SetItemText(i, 1, str1);
i++;
m_ado.MoveNext();
}
UpdateData(FALSE);
}
else if (str == "405")
{
m_list2.InsertColumn(2, _T("波长405"), LVCFMT_CENTER, 100);
while (!m_ado.IsEOF())
{
m_ado.GetFieldByIndex(0, nNumb); //ID
str1.Format(_T("%d"), nNumb);
m_list2.InsertItem(i, str1);
m_ado.GetFieldByIndex(2, nNumb); //405
str1.Format(_T("%d"), nNumb);
m_list2.SetItemText(i, 2, str1);
i++;
m_ado.MoveNext();
}
UpdateData(FALSE);
}
else if (str == "450")
{
m_list2.InsertColumn(1, _T("波长450"), LVCFMT_CENTER, 100);
while (!m_ado.IsEOF())
{
m_ado.GetFieldByIndex(0, nNumb); //ID
str1.Format(_T("%d"), nNumb);
m_list2.InsertItem(i, str1);
m_ado.GetFieldByIndex(3, nNumb); // 450
str1.Format(_T("%d"), nNumb);
m_list2.SetItemText(i, 3, str1);
i++;
m_ado.MoveNext();
}
UpdateData(FALSE);
}
想要实现的效果是:在下拉combobox为405时 list 只显示ID 和 405,在combobox为450时,只显示ID和450的2列,去掉其他的列!
C++技术网解答:
你是想选择下来列表,选择一个值后,列表中显示ID列和选中的数字对应的列,行数保持不变。
列表控件是在最开始初始化的时候,去添加列和列名,然后后续可以反复的操作列表中的内容。这是一般比较常见的使用方法。当然,你要动态改变列数,也是可以的。使用的函数为:CListCtrl::DeleteColumn
函数的声明如下:
BOOL DeleteColumn( int nCol );
传入列的索引即可,删除成功返回非零,删除失败返回0.
下面是示例代码:
CListCtrl* pmyListCtrl;
int nColumnCount = pmyListCtrl->GetHeaderCtrl()->GetItemCount();
int index=1;
for (int i=0;i < nColumnCount;i++)
{
//根据需要来跳过不要被删除的列
if(index==i)continue;
pmyListCtrl->DeleteColumn(0);
}
当然,如果你需要根据列表来比较,可以用GetHeaderCtrl()->GetItem(...)来获取列表头的列的名称。下面是示例代码:
extern CHeaderCtrl* pmyHeaderCtrl;
extern LPCTSTR lpszmyString, lpszmyString2;
int i, nCount = pmyHeaderCtrl->GetItemCount();
HDITEM hdi;
TCHAR lpBuffer[256];
bool fFound = false;
hdi.mask = HDI_TEXT;
hdi.pszText = lpBuffer;
hdi.cchTextMax = 256;
for (i=0;!fFound && (i < nCount);i++)
{
pmyHeaderCtrl->GetItem(i, &hdi);
if (strcmp(hdi.pszText, lpszmyString) == 0)
{
strcpy(hdi.pszText, lpszmyString2);
pmyHeaderCtrl->SetItem(i, &hdi);
fFound = false;
}
}
差不多就是这样了。