列表视图控件中的项和子项
我想使用List-View
控件在“网格”中显示LDAP搜索的结果。 我已经编写了一些测试代码来查看它是如何工作的,但它并没有像我想要的那样显示。 据我了解,每个Item
相当于一个“行”(使用LVS_REPORT
样式),而Subitem
相当于一个“列”(例如,对于每个项目,我可以显示多个子项,每个子项在一个单独的列上同一行)。
这是我的测试代码,目前设置为创建四列,包含一个Item和四个Subitems(对应于四列)。 两个function:一个用于创建列,另一个用于插入项目。
int CreateColumns(HWND *hwndlistbox) { wchar_t *cnames[100]; LVCOLUMN lvc; int i; cnames[0] = L"column1"; cnames[1] = L"column2"; cnames[2] = L"column3"; cnames[3] = L"column4"; cnames[4] = NULL; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; for (i = 0; cnames[i] != NULL; i++) { lvc.iSubItem = i; lvc.pszText = cnames[i]; lvc.cx = 100; lvc.fmt = LVCFMT_LEFT; ListView_InsertColumn(*hwndlistbox, i, &lvc); } return i; } void InsertItems(HWND *hwndlistbox, int *columncount) { LVITEM lvi; wchar_t *items[100]; int i, j; items[0] = L"text1"; items[1] = L"text2"; items[2] = L"text3"; items[3] = L"text4"; items[4] = NULL; lvi.mask = LVIF_TEXT; lvi.iItem = 0; for (i = 0; i < *columncount; i++) { lvi.pszText = items[i]; lvi.iSubItem = i; ListView_InsertItem(*hwndlistbox, &lvi); } }
我希望这会生成一行( lvi.iItem = 0;
),每列下都有一个文本字符串( lvi.iSubItem = i;
)。 这是它显示的内容:
将lvi.iSubItem = i
更改为lvi.iSubItem = 0
导致每个文本字符串在第一列中显示为新行:
我玩过它,硬编码iItem
和iSubItem
上的数字,将两者都改为i
,但我不能让它在第一列以外的任何地方显示文本。 我究竟做错了什么?
首先,你的cnames
和items
数组被声明为指针数组,但你没有为它们分配内存; 你需要将它们声明为字符串数组,如wchar_t cnames[100][40];
。
其次,您需要使用ListView_InsertItem
插入项并设置第一列的值,然后使用ListView_SetItem添加其他列,如
lvi.pszText = items[0]; lvi.iSubItem = 0; ListView_InsertItem(*hwndlistbox, &lvi); for (i = 1; i < *columncount; i++) { lvi.pszText = items[i]; lvi.iSubItem = i; ListView_SetItem(*hwndlistbox, &lvi); }
每行显示一个项目,因此您无法通过添加项目来填充列。
正如文件所说 :
“您不能使用ListView_InsertItem
或LVM_INSERTITEM
来插入子项LVITEM
结构的iSubItem
成员必须为零。有关设置子项的信息,请参阅LVM_SETITEM
。”
LVM_SETITEM文档说明了如何设置子项的文本。