Заполнение DataGridView на лету (VB.NET) - PullRequest
0 голосов
/ 16 ноября 2009

У меня есть DataGridView, который читает данные из пользовательского (CSLA) объекта списка. Набор данных может содержать 100 000 записей, и, очевидно, я не хочу показывать их все сразу, потому что, например, для загрузки потребуется целая вечность.

Думаю, было бы неплохо, если бы я мог прочитать первые (например) 20 записей и сделать это при прокрутке до конца списка, он читает следующие 20 и добавляет их в DataGridView.

Я экспериментировал с различными способами сделать это, в основном используя собственный класс, унаследованный от DataGridView для захвата событий прокрутки, и вызывая событие, которое добавляет новые записи. Я включу код ниже:

Public Class TestDGV
Inherits DataGridView


Public Sub New()

    AddHandler Me.VerticalScrollBar.ValueChanged, AddressOf vsScrollEvent
    AddHandler Me.RowsAdded, AddressOf vsRowsAddedEvent
End Sub

Private Sub vsScrollEvent(ByVal sender As Object, _
                          ByVal e As EventArgs)
    With DirectCast(sender, ScrollBar)

        If .Value >= (.Maximum - .LargeChange) Then
            RaiseEvent ScrollToEnd()
        End If
    End With




End Sub


Private Sub vsRowsAddedEvent(ByVal sender As Object, ByVal e As EventArgs)
    ScrollbarOn()
End Sub

Public Event ScrollToEnd()

Public Sub ScrollbarOff()
    Me.VerticalScrollBar.Enabled = False
End Sub

Public Sub ScrollbarOn()
    Me.VerticalScrollBar.Enabled = True
End Sub

End Class

Хотя это (вроде) работает, оно может содержать ошибки. Самая большая проблема заключалась в том, что если бы вы использовали мышь для прокрутки DataGrid, он застрял бы в цикле при обработке события ValueChanged полосы прокрутки после добавления данных. Вот почему я добавил ScrollbarOff и ScrollbarOn - я вызываю их до и после получения новых записей, что временно отключает полосу прокрутки.

Проблема с в том, что заключается в том, что после повторного включения полосы прокрутки она не отслеживает текущее состояние мыши, поэтому, если вы удерживаете кнопку «Вниз» с помощью мыши (или нажмите на часть полосы прокрутки) она прекратит прокрутку после добавления новых записей, и вам придется щелкнуть ее еще раз.

Кроме того, это не кажется особенно элегантным способом ведения дел.

Кто-нибудь когда-либо делал это раньше, и как вы этого добились?

Приветствие.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Как насчет использования свойства virtual объекта DataGridView? См. Реализация виртуального режима с своевременной загрузкой данных в элементе управления Windows Forms DataGridView , например.

0 голосов
/ 16 ноября 2009

Возможно, вы могли бы уменьшить свой набор результатов и использовать вид перелистывания << и >>. Демонстрация Nerd Dinner представила элегантное решение с использованием LINQ:

//
// GET: /Dinners/
//      /Dinners/Page/2

public ActionResult Index(int? page)
{

    const int pageSize = 20;

    var upcomingDinners = dinnerRepository.FindUpcomingDinners();

    var paginatedDinners = upcomingDinners.Skip((page ?? 0) * pageSize)
                                          .Take(pageSize)
                                          .ToList();

    return View(paginatedDinners);
}
...