Jump to content
Sign in to follow this  
Trix

Sortowanie elementow ListView

Recommended Posts

Witam
Mam kontrolke ListView - zawiera ona 4 kolumny ( 1 Item + 3 SubItem'y). Kontrolka ustawiona jest na automatyczne sortowanie elementow. Problem polega na tym, ze gdy dodam nowy element, a jest on "mniejszy" niz poprzedni, to zostanie on przesuniety przed poprzedni element ale jego podelementy zostaja na tym samym miejscu. Reasumujac jak skojarzyc Item z SubItem tak, aby sortowane byly cale wiersze??

Share this post


Link to post
Share on other sites

Witam
Niestety nie znam metody by robić to automatycznie (za pomocą styli) :( ale można sobie napisać funkcję, która posortuje elementy listy. :) 
Po dodaniu każdego (oczywiście jeżeli dodajemy jednoczesnie dużą liczbę elementów to robimy to tylko po dodaniu wszystkich) elementu do listy trzeba wywołać:

                ;jeżeli wParam = 0 sortowanie rosnące, 1 malejące
                ;lParam to adres funkcji sortującej 
                invoke SendMessage,hLView, LVM_SORTITEMS, 0, addr LVSortProc

Funkcja sortująca może być np. taka:

LVSortProc proc lParam1: LPARAM, lParam2: LPARAM, lParamSort: LPARAM
LOCAL szBuff1[256]:BYTE
LOCAL szBuff2[256]:BYTE
LOCAL lvi:LV_ITEM
    
    ;Wypełnij struktrę LV_ITEM
    mov     lvi.imask, LVIF_TEXT
    mov     lvi.cchTextMax, 256
        mov     lvi.iSubItem, 0 
    lea     eax, szBuff1
    mov     lvi.pszText, eax    
        ;Pobierz teksty do porownania
    invoke  SendMessage, hLView, LVM_GETITEMTEXT, lParam1, addr lvi
    lea     eax, szBuff2 
    mov     lvi.pszText, eax       
    invoke  SendMessage, hLView, LVM_GETITEMTEXT, lParam2, addr lvi
    ;Porwnaj teksty (ignorując wielkość liter)       
    invoke  lstrcmpi, addr szBuff1, addr szBuff2   
    .if lParamSort == 1 ;Jeżeli chcemy sortować malejąco
        neg eax         ;trzeba zmienić znak wyniku porwnania na przeciwny
    .endif
        ret

LVSortProc endp

Oczywiście funkcja w tej postaci zawsze sortuje elementy wg. tekstu Item (pierwszej kolumny) ale można ją przerobić tak, aby sortowała wg. dowolnego SubItem (dowolnej kolumny). Myślę, że jeżeli będziesz miał potrzebę sortowania według kolumn to z tym już sobie poradzisz, ale jeżeli jednak nie to napisz.
Pozdro

Share this post


Link to post
Share on other sites

Spróbój też pokombinować z ListView_Update, np. wysyłając LVM_UPDATE do wszystkich itemów lub tylko do większych niż dodany. Może pomoże.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...