Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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 применима такая вешь, как
ListView1.ListItems(Index).EnsureVisible

Ответить

Номер ответа: 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
Отлично, спасибо!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам