Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > DataGridView Virtual Mode Скроллер


Автор: N1ko 30.4.2010, 09:26
Здравствуйте. Реализовал Virtual Mode у DataGridView только для отображения данных. Редактировать их пользователь не может. Вот код

 
Код

private void FrmDataGridViewResult_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            e.Value = dtResTable.Rows[e.RowIndex][e.ColumnIndex];
        }

        private void FrmDataGridViewResult_Scroll(object sender, ScrollEventArgs e)
        {
            if (e.ScrollOrientation == ScrollOrientation.VerticalScroll && FrmDataGridViewResult.Rows.Count < dtResTable.Rows.Count)
            {
                FrmDataGridViewResult.Rows.Add();
            }
        }


Результаты нормально отрисовуются, всё отлично заполняется. Всёбы хорошо, но наступает момент, когда опускаешь скроллер в самый низ, он уменьшается в размер до минимума и прога зависает. Судя по всему когда я опускаю его  всамый низ, начинают добавляться строки беспрерывно. Можно ли это кк то исправить?

Автор: mrbrooks 30.4.2010, 10:34
Вы поступаете идеологически не верно. Сами посудите - зачем нужно загружать пользователю результат сразу (к примеру) 1000 строк. Визуально он увидит только штук 50 плюс-минус n - в зависимости от рабочего пространства.

На помощь нам приходит парадигма "Model-View". В конкретном случае Вам нужно реализовать т.н. "Paiging" - то есть разбивка результата  постранично, с n-ым количеством строк на странице.

Посмотрите примеры в google. Их там масса smile 

Автор: N1ko 30.4.2010, 10:40
Так ведь загружается изначально строк 50, как Вы и сказали. Я ни в коем случае сразу не загружаю все строки.Если пользователю вздумалось посмотреть остальные результаты, он двигает скролл вниз, чем и вызывается событие на отрисовку новых ячеек по мере опускания скроллера. То есть строки добавляются постепенно, что и предполагает VirtualMode.

Автор: mrbrooks 30.4.2010, 10:54
ок - все понятно. в свое время я просто сталкивался с аналогичным вопросом и решил реализовать именно paiging - это конечно несколько сложнее реализовать - чем VirtualMode - но навигация по страницам мне показалась кошернее . Если не решите свою проблему - вспомните про мой совет. 

Гуд лак  smile 

Автор: N1ko 30.4.2010, 10:57
Ок. Спасибо. Как раз сейчас рассматриваю Ваш совет как альтернативу моему варианту.  smile 

Автор: Sed0Y 30.4.2010, 15:43
не понятно что у тебя там такое происходит, наверно что-то где-то не так про написал... 

вот посмотри примеры:

http://msdn.microsoft.com/ru-ru/library/2b177d6d(v=VS.90).aspx
http://msdn.microsoft.com/ru-ru/library/system.windows.forms.datagridview.cellvalueneeded(v=VS.90).aspx

Автор: N1ko 6.5.2010, 12:27
Судя по всему единственным решением данной проблемы является установка свойства DataGridView.RowCount = n (n - максимальнное количество строк ) вместе с использованием VirualMode. Но не в том случае когда количество строк допустим равно 100000 и 40 колонок как у меня, тогда это воообще не решает проблему. Требуется слишком много времени что бы выполнить DataGridView.RowCount = n. Соответственно в даннном случае использование VirtualMode неприменимо и единственный вариант - использование Paging, как и советовал mrbrooks

Автор: mrbrooks 6.5.2010, 13:50
Цитата(N1ko @  6.5.2010,  13:27 Найти цитируемый пост)
Соответственно в даннном случае использование VirtualMode неприменимо и единственный вариант - использование Paging, как и советовал mrbrooks

 smile 
Проверено временем камрад.

Автор: N1ko 6.5.2010, 17:31
А я хотел бы немного уточнить. Paging паттерн аналогичен Iterator(Cursor) паттерну? В инетеренете на Paging очень мало инфы. Всё что тя нашёл по этиому поводу и сопоставил с Iterator вро де бы сошлось. Если всё же это разные вещи, дайте плз ссылку на ресурс с PAging Pattern

Автор: mrbrooks 6.5.2010, 18:31
N1ko, это не паттерн. Это, скажем так, трюк.

Вот что это из себя предстовляет:
http://www.codeproject.com/KB/grid/DataGridPaging.aspx
http://www.codeproject.com/KB/miscctrl/Pagable_DatagridView.aspx

Цитата(N1ko @  6.5.2010,  18:31 Найти цитируемый пост)
В инетеренете на Paging очень мало инфы. Всё что тя нашёл по этиому поводу и сопоставил с Iterator вро де бы сошлось. Если всё же это разные вещи, дайте плз ссылку на ресурс с PAging Pattern

ищите так и не пожалеете - http://www.google.ru/search?hl=ru&newwindow=1&client=firefox&hs=FGO&rls=ru.yandex%3Aru%3Aofficial&q=paging+datagridview&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&aq=f&aqi=&aql=&oq=&gs_rfai=  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)