Страница: 1 |
Страница: 1 |
Вопрос: Как зафиксировать положение в списке...
Добавлено: 11.10.04 22:54
Автор вопроса: Navigator | ICQ: 177815632
Есть ListView, в который постоянно подгружается разная информация.
Допустим, я переместился скроллом на строку №30, затем идет загрузка очередной порции информации (заново с очисткой списка от предыдущих данных), позиция в списке при этом автоматически сбрасывается на первую строчку. Можно ли как-нибудь зафиксировать положение в списке? Т.е. чтобы после очистки списка и загрузки новых данных положение в списке оставалось прежним (строка №30).
Спасибо.
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #1
Добавлено: 12.10.04 00:06
После того, как заполнена новая порция данных, оставшийся с прошлого заполнения итем имеет индекс 1 (первый в списке). Вот так его можно подвинуть на 30 позицию.
Dim NewLine As ListItem
Set NewLine = LV1.ListItems.Add(30, , <Данные твоего первого итема>
LV1.ListItems.Remove (1)
Этот код вставит в лист новый итем в 30-ю строку. Позаботься, чтобы данные совпадали с первым итемом. И затем удаляется первый.
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 12.10.04 10:18
Че-то я не понял...
Почему не подходит самый простой метод:
Перед очисткой списка запоминаешь свойство TopIndex (в твоем случае - 30). Обновляешь список и восстанавливаешь TopIndex.
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 12.10.04 10:19
Пардон, написал про ListBox
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 12.10.04 10:29
Для ListView применима такая вешь, как
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 12.10.04 12:58
LamerOnLine
Надо чтобы итем стоял в 30-й строке, а не то, чтобы его было видно или не видно.
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 12.10.04 13:25
Ну, тогда какие сложности? Просто запоминай номер элемента, у которого selected=true.
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 12.10.04 15:05
Элемент в списке всего один. Зачем его запоминать? И стоит всегда на первой позиции.
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 12.10.04 15:59
Не, чего-то я совсем недопонял... Че надо сделать то, мы в корне по-разному понимаем!
cresta, если элемент всего один то на него крайне трудно переместится скроллом поскольку того нет.
Я так понимаю, здесь важнен не сам элемент, а именно позиция скролла. То есть, он долистал до тридцатого элемента, полностью обновил список и, тем не менее, следующим в прокрутке должен быть 31 элемент. Разве не так?
Номер ответа: 9
Автор ответа:
Navigator
ICQ: 177815632
Вопросов: 11
Ответов: 70
Профиль | | #9
Добавлено: 12.10.04 17:28
Да, LamerOnLine прав. Мне нужно чтобы оставалась неизменной позиция скролла в списке после любых действий, связанных с обновлением или перезаполнением этого списка, а какой там будет стоять элемент не важно. Наверное, я плохо описал ситуацию, приношу извинения и попробую еще раз объяснить.
Есть список, в который загружается фиксированное кол-во строк, допустим, их 30.
Их не может быть меньше или больше, всегда 30, просто разная информация.
Так вот, на форме размеры ListView такие, что позволяют отображать только 15 строк в
своем окне, соответственно чтобы посмотреть на данные из 30-ой строки приходится
листать скроллом до конца.
Очень часто бывает такая ситуация, когда самая важная информация
находится именно в конце списка в строке №30. Я мотаю список до конца, смотрю
нужные данные, затем загружаю другую порцию информации (другие 30 строк с данными), и
позиция скролла автоматически сбрасывается на первую строку, т.е. чтобы посмотреть данные
из 30-ой строки мне опять нужно мотать список до конца.
Вот, собственно, как зафиксировать скролл на том месте, на котором я его оставил последний раз?
Чтобы я всегда наблюдал именно то место в списке, где я последний раз остановил скролл.
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 12.10.04 18:34
Navigator, в вопросе прозвучало: как сделать, чтобы итем был 30-м в списке? Теперь же ты пишешь, как сделать, чтобы итем было видно?
Корректней вопрос задавай А то мы тут из-за тебя передерёмся с LamerOnLine
Если тебе нужно, чтобы после очистки и нового заполнения элемент, который был в предыдущем заполнении как №30, снова стал под номером 30, то делай, как я сказал в первом ответе. Если тебе нужно чтобы какой-то итем отображался в видимой части листа, делай как написал LamerOnLine. Если нужно и то, и другое, делаешь как я написал, потом после этого как написал LamerOnLine.
Номер ответа: 11
Автор ответа:
Navigator
ICQ: 177815632
Вопросов: 11
Ответов: 70
Профиль | | #11
Добавлено: 12.10.04 20:52
cresta, я же пишу в вопросе - "Вот, собственно, как зафиксировать скролл на том месте, на котором я его оставил последний раз?"
что тут некорректного? Что не ясного? Да и в изначальном вопросе не прозвучало, что строк всего 30, не больше и не меньше, речь шла о "ПОЛОЖЕНИИ В СПИСКЕ". Ты говоришь – “Теперь же ты пишешь, как сделать, чтобы итем было видно?” Хм… найди пожалуйста место где я такое написал в варианте вопроса #2, прочитав перед этим строку со знаком вопроса… Так что дело не только в моем некорректном вопросе, за который кстати я уже извинялся выше… LamerOnLine же понял вопрос? Понял. Значит вопрос корректный, просто понятен не всем. Короче ладно, забей… Всем спасибо. И драться из-за меня не надо, я не женщина )))
Номер ответа: 12
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #12
Добавлено: 12.10.04 21:38
Лады, драться не будем. Просто, имхо, когда говорят о "ПОЛОЖЕНИИ В СПИСКЕ", имеется ввиду номер итема в списке, а не то, до куда прокручен список. Для этого есть другой термин. А вообще вопросы задаются настолько "прозрачно и точно", что и отвечать уже как-то не хочется, чтобы случайно не нарваться А вдруг что-то там другое подразумевается...
Ну ладно. Успехов.
Номер ответа: 13
Автор ответа:
Navigator
ICQ: 177815632
Вопросов: 11
Ответов: 70
Профиль | | #13
Добавлено: 13.10.04 01:04
Ну, волков бояться - в лес не ходить...
Форумы для этого и существуют, чтобы каждый мог высказать свою точку зрения по конкретному вопросу. В общем, я получил несколько ответов на свой вопрос, которые пригодятся мне в будущем, а это очень хорошо! Так, что еще раз спасибо, и удачи тебе тоже.
Номер ответа: 14
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #14
Добавлено: 13.10.04 08:52
Ну... если с выделением элемента, то проще запомнить его индекс и после
загрузки установить обратно
А если же тебе всетаки нужно позицию вне зависимости от выделенного эл-та
сохранять, то тебе вот это подойдет
'USER32
Private Declare Function SetScrollPos Lib "user32.dll" (ByVal hwnd As Long,
ByVal nBar As Long, ByVal nPos As Long, ByVal bRedraw As Long) As Long
Private Declare Function GetScrollPos Lib "user32.dll" (ByVal hwnd As Long,
ByVal nBar As Long) As Long
Получаешь инфу о позиции нужного скролла, "обновляешь" твой список, ставишь
скролл на место (тем более что размер ствоего списка фиксированный)
Рекомендую на время обновления списка блокировать список ф-цией
'USER32
Private Declare Function LockWindowUpdate Lib "user32.dll" (ByVal hwndLock
As Long) As Long
Это существенно ( 30 строк ) ускорит работу и отключит эФФэкт "моргания"
списка
(Снять блокировку LockWindowUpdate &H0)
Номер ответа: 15
Автор ответа:
Navigator
ICQ: 177815632
Вопросов: 11
Ответов: 70
Профиль | | #15
Добавлено: 15.10.04 04:10
Отлично, спасибо!