2014-02-22 44 views
0

當我得到的數據爲DataGridView,我的表單凍結,直到While循環完成,但我的滾動條工作正常。我試過打電話Application.DoEvents();,但那也沒用。DataGridView ScrollBar bug

如果我在一個線程中獲取數據,那麼我的表單不會凍結,但滾動條禁用並且在While完成後無法工作。我嘗試了一個BackgroundWorker,但是滾動條在使用時也有問題。

Private Sub dg() 
    myth = New Threading.Thread(AddressOf dgd) 
    myth.IsBackground = True 
    myth.Start() 
End Sub 

Private Sub dgd() 
    Dim x As Integer 
    If DataGridView1.Rows.Count = 0 Then x = 0 Else x = DataGridView1.Rows.Count 
    Try 
     Dim conn35a As New OleDbConnection("connstring") 
     Dim cmd35a As New OleDbCommand 
     cmd35a.CommandText = "Select count(*) from asd where downur Is Null" 
     cmd35a.CommandType = CommandType.Text 
     cmd35a.Connection = conn35a 
     conn35a.Open() 
     Dim returnValueaa As Integer = cmd35a.ExecuteScalar() 
     conn35a.Close() 
     Dim komut As String = "Select * from asd where downur Is Null" 
     Dim conn2 As New OleDbConnection("connstring") 
     conn2.Open() 
     Dim cmd2 As New OleDbCommand(komut, conn2) 
     Dim dr2 As OleDbDataReader = cmd2.ExecuteReader 
     If dr2.HasRows Then 
      While dr2.Read 
       Dim conn35 As New OleDbConnection("connstring") 
       Dim cmd35 As New OleDbCommand 
       cmd35.CommandText = "select count(*) from grid where ur = '" + dr2.Item("ur").ToString + "'" 
       cmd35.CommandType = CommandType.Text 
       cmd35.Connection = conn35 
       conn35.Open() 
       Dim returnValuea = cmd35.ExecuteScalar() 
       conn35.Close() 
       If returnValuea = 0 Then 
        DataGridView1.Rows.Add() 
        DataGridView1.Rows.Item(x).Cells(0).Value = x + 1 
        DataGridView1.Rows.Item(x).Cells(4).Value = "ID" 
        DataGridView1.Rows.Item(x).Cells(5).Value = dr2.Item("ur").ToString 
        DataGridView1.Rows.Item(x).Cells(6).Value = dr2.Item("ch").ToString 
        DataGridView1.Rows.Item(x).Cells(7).Value = dr2.Item("ti").ToString 
        DataGridView1.Rows.Item(x).Cells(8).Value = ".." 
        Dim client2 As New WebClient 
        Dim url As String = dr2.Item("pic").ToString 
        DataGridView1.Rows.Item(x).Cells(12).Value = New Bitmap(New MemoryStream(client2.DownloadData(url))) 
        DataGridView1.Rows.Item(x).Cells(13).Value = dr2.Item("vi") 
        DataGridView1.Rows.Item(x).Cells(14).Value = dr2.Item("su").ToString() 
        Dim con4 As New OleDbConnection("connstring") 
        con4.Open() 
        Dim cmd5 = New OleDbCommand("INSERT INTO grid (ur) VALUES (@ur)", con4) 
        cmd5.CommandType = CommandType.Text 
        cmd5.Parameters.Add("@ur", OleDbType.VarChar, 500).Value = dr2.Item("ur").ToString 
        cmd5.ExecuteNonQuery() 
        con4.Close() 
        x += 1 
       End If 
      End While 
     End If 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 
+0

沒有錯誤。我看到的唯一的錯誤是當你應該使用[Control.Invoke](http://msdn.microsoft.com/en-us/library/zyzhdc6b(v = vs.110))時,你在工作線程中調用UI線程。的.aspx)。另外,我建議你在[virtual mode]中運行'DataGridView'(http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.virtualmode(v = vs.110) .aspx),因爲這將更快。 –

回答

0

我有同樣的問題。

我解決了這個通過刪除線程並直接調用方法