在MFC中,使用ListBox控件進行數據過濾可以通過以下步驟實現:
AddString
方法將數據源中的每一項添加到ListBox中。ResetContent
方法清除ListBox中的所有項,再使用AddString
方法將過濾后的列表中的每一項添加到ListBox中。以下是一個簡單的示例代碼,演示了如何使用MFC ListBox實現數據過濾:
void CMyDialog::FilterListBox()
{
// 創建一個新的列表框控件
CListBox* pListBox = new CListBox;
pListBox->Create(WS_CHILD | WS_VISIBLE | LBS_HASSTRINGS | LBS_NOTIFY, CRect(10, 10, 200, 200), this, IDC_LISTBOX);
// 準備數據源
CStringArray arrData;
arrData.Add(_T("Apple"));
arrData.Add(_T("Banana"));
arrData.Add(_T("Cherry"));
arrData.Add(_T("Date"));
// 填充新的列表框控件
for (int i = 0; i < arrData.GetSize(); i++)
{
pListBox->AddString(arrData[i]);
}
// 銷毀舊的列表框控件(如果有的話)
if (m_pOldListBox != NULL)
{
m_pOldListBox->DestroyWindow();
delete m_pOldListBox;
m_pOldListBox = NULL;
}
// 保存新的列表框控件的指針
m_pOldListBox = pListBox;
}
BOOL CMyDialog::OnFilterListBox()
{
// 獲取過濾條件
CString strFilter;
GetDlgItemText(IDC_EDIT_FILTER, strFilter);
// 創建過濾函數
BOOL (*pFilterFunc)(const CString&) = NULL;
if (_tcsicmp(strFilter, _T("Apple")) == 0)
{
pFilterFunc = FilterApple;
}
else if (_tcsicmp(strFilter, _T("Banana")) == 0)
{
pFilterFunc = FilterBanana;
}
else if (_tcsicmp(strFilter, _T("Cherry")) == 0)
{
pFilterFunc = FilterCherry;
}
else if (_tcsicmp(strFilter, _T("Date")) == 0)
{
pFilterFunc = FilterDate;
}
// 如果提供了有效的過濾函數,則過濾ListBox
if (pFilterFunc != NULL)
{
FilterListBox();
return TRUE;
}
// 如果沒有提供有效的過濾函數,則顯示錯誤消息
MessageBox(_T("Invalid filter condition!"), _T("Error"), MB_ICONERROR);
return FALSE;
}
BOOL CMyDialog::FilterApple(const CString& strItem)
{
return (strItem.Find(_T("Apple")) != -1);
}
BOOL CMyDialog::FilterBanana(const CString& strItem)
{
return (strItem.Find(_T("Banana")) != -1);
}
BOOL CMyDialog::FilterCherry(const CString& strItem)
{
return (strItem.Find(_T("Cherry")) != -1);
}
BOOL CMyDialog::FilterDate(const CString& strItem)
{
return (strItem.Find(_T("Date")) != -1);
}
在這個示例中,OnFilterListBox
函數獲取用戶輸入的過濾條件,并根據該條件調用相應的過濾函數。過濾函數檢查數據源中的每一項,并返回是否應該將該項顯示在ListBox中。最后,FilterListBox
函數使用過濾后的列表更新ListBox控件。