使用链表分页 CListCtrl数据分页显示
时间: 2024-04-16 19:29:00 浏览: 167
要在C++中使用链表和CListCtrl来实现数据的页显示,你可以将链表中的数据逐个添加到CListCtrl控件中,并根据当前页码和分页大小显示对应的数据。
以下是一个示例代码,展示了如何使用链表和CListCtrl来实现数据的分页显示:
```cpp
#include <afxwin.h>
#include <afxcmn.h>
#include <vector>
struct DataItem {
int id;
CString name;
};
class CMyDialog : public CDialog {
private:
CListCtrl m_listCtrl;
std::vector<DataItem> m_data;
int m_pageSize;
int m_currentPage;
public:
CMyDialog() : CDialog(IDD_MYDIALOG) {
m_pageSize = 5;
m_currentPage = 1;
}
protected:
virtual BOOL OnInitDialog() {
CDialog::OnInitDialog();
// 创建CListCtrl控件
m_listCtrl.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, CRect(10, 10, 300, 200), this, IDC_LIST_CTRL);
m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
// 添加列标题
m_listCtrl.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 50);
m_listCtrl.InsertColumn(1, _T("Name"), LVCFMT_LEFT, 100);
// 添加示例数据到链表
for (int i = 1; i <= 20; i++) {
CString name;
name.Format(_T("Item %d"), i);
m_data.push_back({i, name});
}
// 显示第一页数据
ShowPage(m_currentPage);
return TRUE;
}
void ShowPage(int pageNumber) {
// 清空列表
m_listCtrl.DeleteAllItems();
// 计算当前页的起始索引和结束索引
int startIndex = (pageNumber - 1) * m_pageSize;
int endIndex = startIndex + m_pageSize - 1;
if (endIndex >= m_data.size()) {
endIndex = m_data.size() - 1;
}
// 添加当前页的数据到列表
for (int i = startIndex; i <= endIndex; i++) {
const DataItem& item = m_data[i];
int index = m_listCtrl.InsertItem(i - startIndex, _T(""));
m_listCtrl.SetItemText(index, 0, CString(item.id));
m_listCtrl.SetItemText(index, 1, item.name);
}
}
afx_msg void OnBnClickedPrevButton() {
if (m_currentPage > 1) {
m_currentPage--;
ShowPage(m_currentPage);
}
}
afx_msg void OnBnClickedNextButton() {
int totalPages = (m_data.size() + m_pageSize - 1) / m_pageSize;
if (m_currentPage < totalPages) {
m_currentPage++;
ShowPage(m_currentPage);
}
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_BN_CLICKED(IDC_PREV_BUTTON, &CMyDialog::OnBnClickedPrevButton)
ON_BN_CLICKED(IDC_NEXT_BUTTON, &CMyDialog::OnBnClickedNextButton)
END_MESSAGE_MAP()
int main() {
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);
CMyDialog dlg;
dlg.DoModal();
return 0;
}
```
在这个示例代码中,创建了一个自定义的对话框类`CMyDialog`,其中包含一个CListCtrl控件用于显示数据。
在`OnInitDialog`函数中,首先创建了CListCtrl控件,并设置了扩展样式和列标题。然后,添加了一些示例数据到链表。
`ShowPage`函数用于根据当前页码显示对应的数据。首先,清空列表中的所有项。然后,根据当前页码计算起始索引和结束索引,并将对应的数据逐个添加到列表中。
在`OnBnClickedPrevButton`和`OnBnClickedNextButton`消息处理函数中,分别处理上一页和下一页按钮的点击事件。通过更新当前页码并调用`ShowPage`函数来显示上一页或下一页的数据。
最后,在`main`函数中创建了`CMyDialog`对象,并显示对话框。
运行这段代码,你会看到一个带有上一页和下一页按钮的对话框,点击按钮可以切换数据的分页显示。
这个示例代码基于MFC框架,使用了MFC的消息映射和对话框类。如果你不熟悉MFC,你可以根据自己的需求将相关代码移植到其他框架或平台上。
阅读全文