DataGridView, ADO.NET, привязка и пейджинг на клиенте - PullRequest
2 голосов
/ 04 июня 2009

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

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

UPDATE: Я начал думать о нескольких подходах, чтобы сделать что-то на заказ. Могу ли я получить необязательный «идентификатор количества строк», который DataTable / DataRow использует для внутреннего использования? и сделать что-нибудь с этим, чтобы подсчитать количество записей мне нужно?

Ответы [ 2 ]

2 голосов
/ 04 июня 2009

Вот пример из 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
0 голосов
/ 04 июня 2009

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

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

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

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

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

...