2009-06-03 66 views
2

我正在創建一個WinForm應用程序,該應用程序有幾個帶回大約20000條記錄然後填充DataTable的查詢,並將該DataTable綁定到DataGridView。客戶端上的DataGridView,ADO.NET,綁定和分頁

我想讓用戶一次可以瀏覽網格500條記錄。做這個的最好方式是什麼?我想在客戶端進行分頁。我看到System.Data.DataView有一個過濾器和排序,但沒有任何幫助分頁。

UPDATE: 我開始想一些辦法做一些定製。我能得到DataTable/DataRow內部使用的獨特「行數ID」嗎?並用這些來計算我需要的記錄數量?

回答

2

這裏是VB-技巧的例子:

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

可以說我正在管理250個SQL語句 - 現在我需要爲每個(總計500個stmts)都有一個「count(*)flavored」版本的SQL,我想盡量避免這種情況。 +1表示我「da」有最小,最大的猜測我從來沒有放慢注意到這個功能。 – BuddyJoe 2009-06-03 20:15:08

0

我在尋呼第一次嘗試參與內置的尋呼機。但是,我已經快速遷移到觸發頁面綁定的自定義元素。

通常(至少在ASP),你將DataTable綁定到DataGridView,然後做一個

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

但是,由於我們談論的是20,000條記錄,因此最好先對查找到的記錄數進行初步查找,然後再將500組數據帶入客戶端。

*編輯 - 短暫檢查後,窗體中沒有分頁選項。我最好的猜測是你需要做查找/自定義分頁。