2014-10-12 68 views
2

我想要使用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,但我無法使其顯示除第一列以外的任何地方的文本。我究竟做錯了什麼?

回答

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); 
} 
+0

完美的工作,謝謝。回覆:內存,這只是一些帶有硬編碼字符串的測試代碼; 「真正的」內部將會不同。 – eurotrash 2014-10-12 09:49:13

2

每行都顯示一個項目,因此您無法通過添加項目來填充列。

由於the documentation says

「你不能使用ListView_InsertItemLVM_INSERTITEM插入子項目的LVITEM結構的iSubItem成員必須是零上設置分項信息,請參閱LVM_SETITEM。」

LVM_SETITEM documentation解釋如何設置子項目的文本。

+0

你是對的,謝謝。由於我能夠使用的例子,我接受了另一個答案。 – eurotrash 2014-10-12 09:50:19