· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Сортировка в ListView по двум колонкам

Посл.отвђт Сообщенiе


Дата: Июн 18, 2003 12:27:04

hi

а не подскажет ли многоуважаемый джинн, как отсортировать listview по двум колонкам.
i.e. сначала по имени файла, например, а потом внутри этой сортировки, скажем по дате.

то есть, что при сортировке по дате не нарушалась сортировка по имени.

например, все файлы от 26 числа шли в алфавитном порядке, затем все файлы от 27 по алфавиту и так далее.

как это реализовать?


Дата: Июн 19, 2003 04:44:35

Xrusty
Например, помещать в ListView заранее отсортированные данные.


Дата: Июн 19, 2003 15:02:41

P2M
в общем, конечно, да.. я в таком контексте об этом не думал, бо сразу же все беру из mysql-базы.. эх.. Ж0;)
но все равно спасибо..


Дата: Июн 20, 2003 03:23:20

Xrusty
бо сразу же все беру из mysql-базы
Так ведь SQL предоставляет суперские фичи для сортировки по сравнению с встроенными в ListView!


Дата: Июн 20, 2003 03:48:40

LVM_SORTITEMS
Нужно создать свою функцию сравнение (просто переход на lstrcmp). Вот как у меня (FASM):

...
.elseif [eax+NMHDR.code],e,LVN_COLUMNCLICK
mov ecx,[eax+NMLISTVIEW.iSubItem]
mov [dwSortColumn],ecx
stdcall [PostMessage],[eax+NMHDR.hwndFrom],LVM_SORTITEMS,[eax+NMHDR.hwndFrom], OFFSET CompareItems
...

proc CompareItems,lParam1,lParam2,lParamSort
enter
mov eax,[lParam1]
mov [lvfi.flags],LVFI_PARAM
mov [lvfi.lParam],eax
stdcall [SendMessage],[lParamSort],LVM_FINDITEM,-1,OFFSET lvfi
mov ecx,[dwSortColumn]
mov [lvi.mask],LVIF_TEXT
mov [lvi.iItem],eax
mov [lvi.iSubItem],ecx
mov [lvi.pszText],OFFSET szItemPrimary
mov [lvi.cchTextMax],100h
stdcall [SendMessage],[lParamSort],LVM_GETITEM,0,OFFSET lvi

mov eax,[lParam1]
mov [lvfi.lParam],eax
stdcall [SendMessage],[lParamSort],LVM_FINDITEM,-1,OFFSET lvfi
mov [lvi.iItem],eax
mov [lvi.pszText],OFFSET szItemSecondary
mov [lvi.cchTextMax],100h
stdcall [SendMessage],[lParamSort],LVM_GETITEM,0,OFFSET lvi

push esi edi
mov esi,OFFSET szItemPrimary
mov edi,OFFSET szItemSecondary
mov ecx,100h shr 2
repe cmpsd
pop edi esi
.quit: return


Дата: Июн 20, 2003 05:31:28

comrade
У Вас в коде SendMessage с LVM_FINDITEM.
Цитата из LVM_SORTITEMS Message:
"Note During the sorting process, the list-view contents are unstable. If the callback function sends any messages to the list-view control aside from LVM_GETITEM (ListView_GetItem), the results are unpredictable."
Вопрос: MSDN врет?

Xrusty
все беру из mysql-базы
Разве не логично будет брать из SQL при помощи SELECT ... FROM ... ORDER BY col1, col2?
Можно подработать код comrade, чтобы он учитывал при сравнении значения из более чем одной колонки.


Дата: Июн 21, 2003 21:11:23

дык.. это все хорошо, а почему order by не хочет работать с _тремя_ значениями?

order by date,type,name

типы полей:
date datetime
type tinyint(1) unsigned
name varchar(40)

сортирует только по первым двум.. любым.
в доках ничего нету, max_sort_length имхо это про fulltext search..

??


Дата: Июн 23, 2003 01:47:19

да, забыл, версия mysql сервера 3.23.29..

чего делать-то? что у меня не так поставлено?


Дата: Июн 23, 2003 06:31:14

Xrusty
С MySQL я не работал, поэтому могу только гадать.
Допустимы ли имена полей DATE и TYPE?

PS afaik max_sort_length это если в ORDER BY указано BLOB-поле.


Дата: Авг 2, 2003 00:57:22

Старая тема, однако :)

дык.. это все хорошо, а почему order by не хочет работать с _тремя_ значениями?
order by date,type,name

Слова самого Марка Матьюса (создатель Connector/J Для mySQL):
"One of the things you should notice from the ORDER BY clause is it cannot be used to sort by multiple columns. MySQL includes another clause, called GROUP BY, that can be used to group together common values within multiple columns."
Иными словами, надо юзать GROUP BY для сортировки по нескольким колонкам.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.035