2

私は、約 20000 レコードを戻してから DataTable を埋め、その DataTable を DataGridView にバインドするいくつかのクエリを持つ WinForm アプリケーションに取り組んでいます。

ユーザーが一度にグリッド 500 レコードをページングできるようにしたいと考えています。これを行う最善の方法は何ですか?クライアント側でページングを行いたい。System.Data.DataView にはフィルターと並べ替えがありますが、ページングには役立ちません。

更新: 何かカスタムを行うためのいくつかのアプローチについて考え始めました。DataTable/DataRow が内部で使用する一意の「行数 ID」を取得できますか? 必要なレコードの数を数えるためにそれで何かをしますか?

4

2 に答える 2

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
于 2009-06-03T20:09:26.127 に答える
0

ページングの最初の試みには、組み込みのページャーが含まれていました。ただし、ページ バインドをトリガーするカスタム要素にすぐに移行しました。

通常 (少なくとも ASP では)、DataTable を DataGridView にバインドしてから、

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

ただし、ここでは 20.000 レコードについて話しているので、最初に見つかったレコード数を調べてから、500 セットをクライアントに取り込むことをお勧めします。

*EDIT - 簡単に確認したところ、Windows フォームにはページング オプションがありません。私の最善の推測は、検索/カスタム ページングを行う必要があるということです。

于 2009-06-03T20:11:11.537 に答える