当前位置:C++技术网 > 资讯 > 下拉combobox,动态显示listcontrol 的内容

下拉combobox,动态显示listcontrol 的内容

更新时间:2016-09-29 20:00:04浏览次数:1+次

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;
   }
}
     差不多就是这样了。