Возможно ли разбиение на страницы в DataGridView? - PullRequest
0 голосов
/ 05 июня 2019

Возможно ли разбиение на страницы в DataGridView в VB.NET?Я успешно подключился к базе данных и могу импортировать данные в DataGrid, но проблема в том, что у меня огромная таблица с более чем 10 миллионами строк.Таким образом, отображение всего в одном представлении либо замедляет время загрузки, либо, если я решу добавить дополнительные столбцы данных, приложение окажется ошибкой.

Например, эта строка будет работать

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 Ответ

1 голос
/ 06 июня 2019

Да, конечно.Вот как я обычно это делаю.

Необходимые условия:

  • DataGridView DataGridView1
  • ToolStrip ToolStrip1
    • TextBox PageNo
    • Label PageCount
    • Button btnPageBack
    • Button btnPageNext
    • Label TotalShown
    • Label OutOfTotalRecords
    • (некоторые метки, такие как «Страница», «из», «Всего показано», «из», «записи»)
  • Dim RowsPerPage как Int16 = 40 'set

Вот так выглядит нижний колонтитул ToolStrip DataGridView в конструкторе:

enter image description here

Загрузка или обновление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, присвоение его DataGridView s DataSource и тому подобное.

Кнопка Назад (я не буду ставить Next, она почти идентична, только что измениласьограничивающее условие и итерация):

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

И это все.Простой, удобный в использовании, работает как шарм, проверенный временем.Нет беспорядка сторонних элементов управления и библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...