【问题标题】:Is paging in DataGridView possible?是否可以在 DataGridView 中进行分页?
【发布时间】:2019-06-07 18:39:12
【问题描述】:

在 VB.NET 中是否可以在 DataGridView 中进行分页? 我已经成功连接到数据库并且能够将数据导入 DataGrid,但问题是我拥有的表很大,有超过 1000 万行。因此,在一个视图中全部显示要么会减慢加载时间,要么如果我选择添加更多数据列,应用程序将出现错误。

例如,这条线可以工作

cmd.CommandText = "SELECT primaryTitle, startYear, runtimeMinutes, genres, FROM Basics"

但是这一行会抛出一个名为 System.OutOfMemoryException 的错误

cmd.CommandText = "SELECT primaryTitle, startYear, runtimeMinutes, genres, directors, writers FROM Basics, Crew"

任何帮助将不胜感激。

这是我当前的代码。我唯一做的就是将数据导入 DataGridView,因为我不能再继续了。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim con As New SqlClient.SqlConnection
        con.ConnectionString = "Data Source=DESKTOP-7SOUE1N\SQLEXPRESS;Initial Catalog=IMDb MOVIE DATABASE SYSTEM;Integrated Security=True"
        con.Open()

        Dim cmd As New SqlClient.SqlCommand
        cmd.Connection = con
        cmd.CommandText = "SELECT primaryTitle, startYear, runtimeMinutes, genres, directors, writers FROM Basics, Crew"
        Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader
        Dim dt As New DataTable
        dt.Load(rdr)
        rdr.Close()
        DataGridView1.DataSource = dt

        con.Close()
    End Sub
End Class

【问题讨论】:

  • 是将其导入数据表进行管理是一种选择,还是需要在 SQL 级别进行?
  • 将其导入 datagridview 不是一种选择,问题要求我在启动时在表和列视图中列出所有内容。
  • 你可能想看看VirtualMode

标签: vb.net datagridview


【解决方案1】:

是的,当然是。我通常是这样做的。

先决条件:

  • DataGridViewDataGridView1
  • ToolStripToolStrip1
    • TextBoxPageNo
    • LabelPageCount
    • ButtonbtnPageBack
    • ButtonbtnPageNext
    • LabelTotalShown
    • LabelOutOfTotalRecords
    • (一些标签,如“Page”、“from”、“Total shown”、“out of”、“records”)
  • 将 RowsPerPage 设置为 Int16 = 40 ' 设置

这是ToolStrip 波纹管DataGridView 页脚在设计器中的外观:

获取或更新列表 SQL(包装在LoadListOfRecords() sub中):

"SELECT
    ...
 ORDER BY " & dgwSortCol & " " & dgwSortOrder & "  " &
 OFFSET " & ((IIf(Me.PageNo.Text = "", 1, CInt(Me.PageNo.Text)) - 1) * RowsPerPage) & " 
 ROWS FETCH NEXT " & RowsPerPage & " ROWS ONLY; "

一开始你可能会跳过ORDER。但请注意OFFSET xx ROWS,它告诉它应该从数据库中的哪个位置开始读取记录(从开始偏移多少记录)和FETCH NEXT xx ROWS ONLY,它告诉要读取多少行并将其加载到“页面”。我跳过了创建DataSet、阅读DataTable、将其分配给DataGridViewDataSource 等内容。

按钮返回(下一步我就不放了,几乎一模一样,只是改变了限制条件和迭代):

Private Sub btnPageBack_Click(sender As System.Object, e As System.EventArgs) Handles btnPageBack.Click
    If CInt(Me.PageNo.Text) > 1 Then
        Me.PageNo.Text = CInt(Me.PageNo.Text) - 1
    End If
    Call LoadListOfRecords()
End Sub

Enter 击键之后手动输入页码(转到特定页面):

Private Sub PageNo_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles PageNo.KeyDown
    Call LoadListOfRecords()
End Sub

就是这样。简单,易于用户使用,具有魅力,经时间证明。没有杂乱的第 3 方控件和库。

【讨论】:

  • SELECT primaryTitle, startYear, runtimeMinutes, genres FROM Basics ORDER BY primaryTitle ASC OFFSET ((IIf(Me.PageNo.Text = "", 1, CInt(Me.PageNo.Text)) - 1) * 50) FETCH NEXT 50 ROWS ONLY" 这是错的吗?我的代码似乎无法正常工作
  • 是的,您的 SQL 代码有一个小错误,请注意括号中的代码旁边缺少ROWS。所以它就像OFFSET 500 ROWS FETCH NEXT 50 ROWS ONLY。最好在 SSMS 等工具中对 SQL 代码进行故障排除,然后在 VB.NET 代码中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2010-10-25
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多