专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VB Dotnet

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

发布时间:2011-06-23 16:01:57 文章来源:www.iduyao.cn 采编人员:星星草
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


友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: