读书人

DataGridView 动态切换数据源 线程有关

发布时间: 2012-01-10 21:26:50 作者: rapoo

DataGridView 动态切换数据源 线程问题
从界面为 DataGridView 从数据库重新加载数据,由于加载数据比较慢,我开启了一个线程。但是虽然开启了线程,可是主线程仍然要等待数据加载完毕才能响应,这等于辅助线程并没有起到后台的作用,界面仍然出现假死,很不爽。正确方法应该怎么处理呢。
请高手给个思路,谢谢!

VB.NET code
        DataGridView1.Columns.Clear()        TempTh = New Thread(AddressOf 载入极限数据)        TempTh.Start()        TempTh.Join()        '代码略——DataGridView1绑定数据后,处理DataGridView 列宽等属性


[解决办法]
VB.NET code
 
Imports System.ComponentModel

Public Class Form1
Private m_Count As Integer

Dim PrcentForm As Form2

Private Delegate Sub PrecentChangeDelegate(ByVal Precent As Integer)
Private Delegate Function RunDelegate() As Integer
Private Delegate Sub CompleteDelegate(ByVal Value As Integer)

Private Asyresult As IAsyncResult
Private List As BindingList(Of Datalist)

Private Run As RunDelegate
Private Rand As New Random

Public Sub DisPlayPrecent(ByVal Precent As Integer)
PrcentForm.PB.Value = Precent
If Precent = PrcentForm.PB.Maximum Then
PrcentForm.Close()
End If
End Sub

Private Sub OKbtn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OKbtn.Click

m_Count = 700000
PrcentForm = Form2
PrcentForm.Show()


Run = New RunDelegate(AddressOf LoadData) '异步调用数据加载过程
Asyresult = Run.BeginInvoke(New AsyncCallback(AddressOf CallBack), Nothing)

End Sub

Private Sub CallBack() '通过回调实现绑定
Dim i As Integer = Run.EndInvoke(Asyresult)
Me.Invoke(New CompleteDelegate(AddressOf BindingData), New Object() {i})

End Sub

Private Sub BindingData(ByVal Value As Integer) '绑定到DataGridView1
DataGridView1.DataSource = List

Me.Text = Value
End Sub

Private Function LoadData() As Integer '模拟加载数据
List = New BindingList(Of Datalist)
Dim i As Integer = 1
Dim Sum As Long = 0
While i <= m_Count
Dim T As New Datalist(i)
Me.Invoke(New PrecentChangeDelegate(AddressOf DisPlayPrecent), New Object() {CInt(i / m_Count * 100)})
List.Add(T)
'Sum += i

i += 1

End While
Return i
End Function

End Class

Public Class Datalist '数据模型
Private m_Number As Integer
Public ReadOnly Property Number()
Get
Return m_Number
End Get
End Property
Public Sub New(ByVal I As Integer)
m_Number = I
End Sub

End Class


读书人网 >VB Dotnet

热点推荐