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

问题描述:

我想要使用List-View控件在“网格”中显示LDAP搜索的结果。我已经写了一些测试代码来看看它是如何工作的,但它并没有按照我的意愿显示。据我了解,每个Item相当于一个“行”(使用LVS_REPORT风格),而Subitem相当于一个“列”(例如,对于每个项目我可以显示多个子项目,每个子项目都在单独的列中相同的行)。列表视图控件中的项目和子项目

这是我的测试代码,目前设置为创建四列,带有单个项目和四个子项目(对应于四列)。两个功能:一个创建列,另一个插入项目。

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 = ilvi.iSubItem = 0结果被显示为新行的第一列:

enter image description here

我周围玩使用它,对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); 
} 
+0

完美的工作,谢谢。回复:内存,这只是一些带有硬编码字符串的测试代码; “真正的”内部将会不同。 – eurotrash 2014-10-12 09:49:13

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

由于the documentation says

“你不能使用ListView_InsertItemLVM_INSERTITEM插入子项目的LVITEM结构的iSubItem成员必须是零上设置分项信息,请参阅LVM_SETITEM。”

LVM_SETITEM documentation解释如何设置子项目的文本。

+0

你是对的,谢谢。由于我能够使用的例子,我接受了另一个答案。 – eurotrash 2014-10-12 09:50:19