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

时间:2014-10-12 09:00:55

标签: c winapi

我想使用List-View控件在“网格”中显示LDAP搜索的结果。我已经编写了一些测试代码来查看它是如何工作的,但它并没有像我想的那样显示。据我了解,每个Item相当于“行”(使用LVS_REPORT样式),而Subitem相当于“列”(例如,我可以显示的每个项目)许多子项,每个子项位于同一行的单独列中。

这是我的测试代码,目前设置为创建四列,包含一个Item和四个Subitems(对应于四列)。两个函数:一个用于创建列,另一个用于插入项目。

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;)下都有一个文本字符串。这就是它显示的内容:

enter image description here

lvi.iSubItem = i更改为lvi.iSubItem = 0会导致每个文本字符串在第一列中显示为新行:

enter image description here

我玩过它,对iItemiSubItem上的数字进行硬编码,将两者都更改为i,但我无法在其他地方显示文字比第一列。我做错了什么?

2 个答案:

答案 0 :(得分:4)

首先,您的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);
}

答案 1 :(得分:2)

每行显示一个项目,因此您无法通过添加项目来填充列。

作为the documentation says

&#34;您无法使用ListView_InsertItemLVM_INSERTITEM来插入子项。 iSubItem结构的LVITEM成员必须为零。有关设置子项目的信息,请参阅LVM_SETITEM。&#34;

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