列表视图控件中的项和子项

我想使用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导致每个文本字符串在第一列中显示为新行:

在此处输入图像描述

我玩过它,硬编码iItemiSubItem上的数字,将两者都改为i ,但我不能让它在第一列以外的任何地方显示文本。 我究竟做错了什么?

首先,你的cnamesitems数组被声明为指针数组,但你没有为它们分配内存; 你需要将它们声明为字符串数组,如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_InsertItemLVM_INSERTITEM来插入子项LVITEM结构的iSubItem成员必须为零。有关设置子项的信息,请参阅LVM_SETITEM 。”

LVM_SETITEM文档说明了如何设置子项的文本。