DataGridView, ADO.NET, привязка и пейджинг на клиенте

Я работаю над приложением WinForm, которое имеет несколько запросов, которые возвращают около 20000 записей, а затем заполняют DataTable и привязывают этот DataTable к DataGridView.

Я хочу разрешить пользователям просматривать сетку по 500 записей за раз. Как лучше всего это сделать? Я хочу сделать пейджинг на стороне клиента. Я вижу, что в System.Data.DataView есть фильтр и сортировка, но ничего не помогает с пейджингом.

ОБНОВЛЕНИЕ: я начинаю думать о нескольких подходах, чтобы сделать что-то нестандартное. Могу ли я получить уникальный «идентификатор количества строк», который DataTable/DataRow использует для внутреннего использования? и сделать что-то с этим, чтобы подсчитать количество нужных мне записей?


person BuddyJoe    schedule 03.06.2009    source источник


Ответы (2)


Вот пример из VB-Tips:

http://www.vb-tips.com/dbPages.aspx?ID=5dbe894a-a7e6-434c-bd84-73494c71063f

Imports System.Data.SqlClient
Imports System.Text
Imports System.ComponentModel

Public Class Form1

    Dim da As SqlDataAdapter
    Dim conn As SqlConnection
    Dim ds As New DataSet

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim strConn As String
        Dim cmd As SqlCommand
        Dim sbCmd As New StringBuilder


        strConn = String.Format("Server = {0};", Environment.MachineName)
        strConn &= "Database = NorthWind; Integrated Security = SSPI;"
        conn = New SqlConnection(strConn)
        cmd = New SqlCommand("Select count(ProductName) From Products", conn)
        Try
            da = New SqlDataAdapter("Select * from Products", conn)

            conn.Open()

            With nuPage
                .Maximum = Math.Ceiling(cmd.ExecuteScalar / 10)
                .Minimum = 1
                .Increment = 1
                .Value = 1
            End With

            conn.Close()

            da.Fill(ds, 0, 10, "Products")
            ds.Tables("Products").DefaultView.AllowNew = False
            DataGridView1.DataSource = ds.Tables("Products")
            For Each col As Object In DataGridView1.Columns
                If TypeOf col Is DataGridViewCheckBoxColumn Then
                    DirectCast(col, DataGridViewCheckBoxColumn).Visible = False
                ElseIf TypeOf col Is DataGridViewTextBoxColumn Then
                    Dim tbc As DataGridViewTextBoxColumn = CType(col, DataGridViewTextBoxColumn)
                    If tbc.Name = "ProductName" Then
                        tbc.Width = 275
                        tbc.HeaderText = "Product Name"
                    ElseIf tbc.Name = "UnitPrice" Then
                        tbc.Width = 75
                        tbc.HeaderText = "Price"
                        tbc.DefaultCellStyle.Format = "c"
                        tbc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                    Else
                        tbc.Visible = False
                    End If
                End If
            Next
        Catch ex As Exception
            Trace.WriteLine(ex.ToString)
        End Try

    End Sub

    Private Sub nuPage_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nuPage.ValueChanged
        Dim intStart As Integer = (nuPage.Value - 1) * 10
        ds.Clear()
        da.Fill(ds, intStart, 10, "Products")

    End Sub
End Class
person TheTXI    schedule 03.06.2009
comment
Допустим, я управляю 250 операторами SQL - с помощью этого метода теперь мне нужно иметь версию SQL со вкусом (*) для каждого (всего 500 stmts), я хотел бы попытаться избежать этого. +1 за то, что показал мне, что у даса было минимальное, максимальное предположение, что я никогда не замедлялся, чтобы заметить эту функцию. - person BuddyJoe; 04.06.2009

Мои первые попытки пейджинга включали встроенный пейджер. Однако я быстро перешел на пользовательские элементы, которые вызывают привязку страницы.

Обычно (по крайней мере, в ASP) вы должны привязать DataTable к DataGridView, а затем выполнить

DataGridView.ActivePageIndex=x; DataGridView.Databind();

Однако, поскольку мы говорим о 20 000 записей, лучше всего выполнить первоначальный поиск количества найденных записей, а затем просто ввести в клиент наборы из 500 записей.

* РЕДАКТИРОВАТЬ - после краткой проверки в формах Windows нет параметров подкачки. Мое лучшее предположение заключается в том, что вам нужно будет выполнить поиск/пользовательскую разбивку по страницам.

person mtranda    schedule 03.06.2009