Elementi e elementi secondari nel controllo List-View

Voglio utilizzare un controllo List-View per visualizzare i risultati di una ricerca LDAP in una “griglia”. Ho scritto un codice di prova per vedere come funziona, ma non viene visualizzato come voglio. A quanto ho capito, ogni Item equivale a una “riga” (utilizzando lo stile LVS_REPORT ) e il Subitem è equivalente a una “colonna” (ad es. Per ogni elemento posso visualizzare un numero di elementi secondari, ciascuno in una colonna separata sul stessa riga).

Ecco il mio codice di test, attualmente impostato per creare quattro colonne, con un singolo elemento e quattro elementi secondari (corrispondenti alle quattro colonne). Due funzioni: una per creare le colonne, l’altra per inserire elementi.

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

Mi aspetto che questo generi una singola riga ( lvi.iItem = 0; ) con una stringa di testo sotto ogni colonna ( lvi.iSubItem = i; ). Questo è quello che mostra invece:

inserisci la descrizione dell'immagine qui

Cambiando lvi.iSubItem = i in lvi.iSubItem = 0 risultati in ogni stringa di testo visualizzata come una nuova riga nella prima colonna:

inserisci la descrizione dell'immagine qui

Ho giocato con esso, hardcoding i numeri su entrambi iItem e iSubItem , cambiando entrambi i , ma non riesco a farlo visualizzare il testo in nessun punto diverso dalla prima colonna. Che cosa sto facendo di sbagliato?

Prima di tutto, i tuoi array cnames e items sono dichiarati come array di puntatori, ma non stai allocando memoria per loro; dovresti dichiararli come una serie di stringhe, come wchar_t cnames[100][40]; .

In secondo luogo, è necessario utilizzare ListView_InsertItem per inserire un elemento e impostare il valore per la prima colonna, quindi utilizzare ListView_SetItem per aggiungere colonne aggiuntive, ad esempio

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

Ogni riga mostra un singolo elemento in modo che non è ansible popolare le colonne aggiungendo elementi.

Come dice la documentazione :

“Non è ansible utilizzare ListView_InsertItem o LVM_INSERTITEM per inserire elementi secondari.Il membro LVITEM struttura LVITEM deve essere LVM_SETITEM per informazioni sull’impostazione di elementi secondari.”

La documentazione LVM_SETITEM spiega come impostare il testo di una voce secondaria.