نوشته شده توسط
a.1397
ممنون از پیگیریتون. ولی اینجوری فایده نداره. این مدلی داده ها رو تقسیم میکنه به چندین صفحه و مثلا اگر کاربر بخاد فیلدی رو فیلتر کنه فقط تو همون صفحه فیلتر اعمال میشه نه تو تمام رکوردها!
باید بگونه ای باشه که کل داده هارو کابر بتونه روشون مدیریت داشته باشه
ممکنه زمانی که برای خواندن تمامی داده ها لازمه زیاد باشه، خیلی اوقات هم نمیشه برای کاهش زمان کاری کرد.
ولی لزومی نداره که تا خواندن آخرین رکورد چیزی نمایش ندید، کاربر رو با چیزی که فعلا بدست اومده مشغول کنید، می توانید به صورت تدریجی بخونید و نمایش بدید و حتی به روش دلخواه تون نتیجه رو فیلتر کنید.
Imports System.ComponentModel
Public Class Form1
Private dg As DataGridView
Private WithEvents bw As BackgroundWorker
Private pb As ProgressBar
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
bw = New BackgroundWorker
bw.WorkerReportsProgress = True
dg = New DataGridView
dg.ReadOnly = True
dg.AllowUserToAddRows = False
dg.Columns.Add("ColumnId", "Id")
dg.Columns.Add("ColumnTitle", "Title")
dg.Columns.Add("ColumnVarA", "VarA")
dg.Columns.Add("ColumnVarB", "VarB")
dg.Columns.Add("ColumnVarC", "VarC")
dg.Parent = Me
dg.Dock = DockStyle.Fill
dg.RowHeadersVisible = False
pb = New ProgressBar
pb.Parent = Me
pb.Dock = DockStyle.Bottom
bw.RunWorkerAsync()
End Sub
Private Sub bw_DoWork(sender As Object, e As DoWorkEventArgs) Handles bw.DoWork
Dim i As Integer, n As Integer, count As Integer
Dim rows As New List(Of DataGridViewRow)
count = 200000
Dim rnd As New Random
Do While (n < count)
rows.Clear()
For i = 1 To 10000
n += 1
Dim row As New DataGridViewRow
row.CreateCells(dg)
row.SetValues(n, "title " & n, rnd.Next(), rnd.Next(), rnd.Next())
rows.Add(row)
If (n = count) Then Exit For
Next
System.Threading.Thread.Sleep(2000)
bw.ReportProgress(100.0 * n / count, rows.ToArray())
Loop
End Sub
Private Sub bw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bw.ProgressChanged
Dim rows() As DataGridViewRow = CType(e.UserState, DataGridViewRow())
pb.Value = e.ProgressPercentage
dg.Rows.AddRange(rows)
End Sub
Private Sub bw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
pb.Visible = False
End Sub
End Class