List Control 基本操作实现代码
//(1)InsertItem-- - 插入一个主项(行)
//(2)DeleteItem-- - 删除一个主项(行)
//(3)InsertColumn-- - 插入一个列
//(4)DeleteColumn-- - 删除一个列 (索引从0开始)
//(5)SetItemText-- - 设置子项文本
//(6)GetItemText-- - 获得子项文本
//(7)GetItemCount-- - 获得项目的总数(总行数目)
//(8)SetImageList-- - 把图像列表与列表控件关联(设置列表图标需要)
以下代码示例基于 VS MFC 的 CListCtrl 类,展示如何实现列和行的增删改查操作。假设已通过资源编辑器创建了名为 IDC_LIST1 的控件,并在对话框类中通过 DDX_Control 关联了变量 m_listCtrl。
初始化列表控件
// 在 OnInitDialog() 中初始化列表样式和列头
m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
// 添加初始列
m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_CENTER, 80);
m_listCtrl.InsertColumn(2, _T("职业"), LVCFMT_LEFT, 120);
插入行数据
int nRow = m_listCtrl.InsertItem(0, _T("张三")); // 插入主项(行)
m_listCtrl.SetItemText(nRow, 1, _T("25")); // 设置子项文本
m_listCtrl.SetItemText(nRow, 2, _T("工程师"));
nRow = m_listCtrl.InsertItem(1, _T("李四"));
m_listCtrl.SetItemText(nRow, 1, _T("30"));
m_listCtrl.SetItemText(nRow, 2, _T("设计师"));
删除指定行
int nSelected = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);
if (nSelected != -1) {
m_listCtrl.DeleteItem(nSelected); // 根据索引删除行
}
插入新列
int nColCount = m_listCtrl.GetHeaderCtrl()->GetItemCount();
m_listCtrl.InsertColumn(nColCount, _T("薪资"), LVCFMT_RIGHT, 100);
删除指定列
if (m_listCtrl.GetHeaderCtrl()->GetItemCount() > 0) {
m_listCtrl.DeleteColumn(0); // 删除索引为0的列
}
获取单元格文本
CString strText = m_listCtrl.GetItemText(0, 1); // 获取第0行第1列文本
AfxMessageBox(strText);
获取总行数
int nTotalItems = m_listCtrl.GetItemCount();
CString strMsg;
strMsg.Format(_T("总行数: %d"), nTotalItems);
AfxMessageBox(strMsg);
设置图像列表
// 创建图像列表(需提前准备图标资源)
CImageList m_imageList;
m_imageList.Create(16, 16, ILC_COLOR32, 2, 2);
m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
// 关联图像列表
m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL);
// 使用带图标的插入
m_listCtrl.InsertItem(0, _T("带图标项"), 0); // 第三个参数为图标索引
注意事项
- 列索引从0开始计数,操作前应通过
GetHeaderCtrl()->GetItemCount()检查列数 - 删除行时应先检查
GetNextItem(-1, LVNI_SELECTED)返回值避免越界 - 图像列表对象需保持生命周期,通常声明为类成员变量
- 大量数据操作时建议使用
SetRedraw(FALSE)暂停重绘,操作完成后SetRedraw(TRUE)
以上代码需根据实际项目需求调整参数和错误处理逻辑。
6080

被折叠的 条评论
为什么被折叠?



