2009-06-03 4 views
2

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

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

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

ответ

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 
+0

Допустим, что я управляю 250 SQL-выражениями - теперь с этим методом я должен иметь «SQL-версию» с подсчетами (*) для каждой версии (всего 500 т.). Я хотел бы попытаться избежать этого. +1 за то, что я показал «да», был минимальный, макс, я никогда не замедлил замечать эту особенность. – BuddyJoe

0

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

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

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

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

* EDIT - после кратковременной проверки в формах окон нет параметров подкачки. Мое лучшее предположение заключается в том, что вам нужно будет выполнить поиск/пользовательский пейджинг.

Смежные вопросы