在DataGridView中可以分页吗?

时间:2019-06-05 14:02:23

标签: vb.net datagridview

在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

1 个答案:

答案 0 :(得分:1)

是的,当然是。这就是我通常的做法。

先决条件:

  • DataGridView DataGridView1
  • ToolStrip ToolStrip1
    • TextBox页面编号
    • Label PageCount
    • Button btnPageBack
    • Button btnPageNext
    • Label TotalShown
    • Label OutOfTotalRecords
    • (一些标签,例如“页面”,“来自”,“显示的总数”,“超出”,“记录”)
  • 将RowsPerPage设置为Int16 = 40'设置

这是ToolStrip下面的DataGridView页脚在设计器中的外观:

enter image description here

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

"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,将其分配给DataGridView的{​​{1}}之类的工作。

后退按钮(我不会放在下一步,它几乎相同,只是更改了限制条件和迭代):

DataSource

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

就是这样。简单,易于用户使用,魅力十足,久经考验。没有混乱的第三方控制和库。