2010-09-08 62 views
0

我有一個有點問題,我使用一個BackgroundWorker做了很多處理,並將其添加項目到ListView有:vb.net - lockwindowupdate和BackgroundWorker的

AddListItem(ListView1, listItem) 

這裏委託代碼將命令發送到ListView的線程之外:

Delegate Sub AddListItem_Delegate(ByVal [ListView] As ListView, ByVal [text] As Object) 
Private Sub AddListItem(ByVal [ListView] As ListView, ByVal [text] As ListViewItem) 
    If [ListView].InvokeRequired Then 
     Dim MyDelegate As New AddListItem_Delegate(AddressOf AddListItem) 
     Me.Invoke(MyDelegate, New Object() {[ListView], [text]}) 
    Else 
     ListView1.Items.Add([text]) 
    End If 
End Sub 

的問題是,如你所想,忽隱忽現的列表視圖中。任何人都可以幫我解決在後臺工作中執行LockWindowUpdate(Me.Handle)命令嗎?我試過創建一個新的委託,但它不工作(錯誤,我不明白vb.net足夠)。

謝謝!

回答

0

請務必不要頻繁調用此代碼,這對UI線程的健康狀況非常不利。如果你每秒調用1000次以上,那麼UI線程將會完全停止響應。它不會重新繪製,也不會響應鼠標點擊。

如果您有大量要添加的項目,請確保先將它們存儲在List(OfListViewItem)中,然後調用Invoke並將它們添加到列表視圖中,並由BeginUpdate()和EndUpdate()括起來, 。 LockWindowUpdate()沒有意義。

這將照顧大多數閃爍,但不會完全消除它。 ListView類支持雙緩衝但默認情況下不啓用。要解決這個問題,請在您的項目中添加一個新類並粘貼下面顯示的代碼。編譯。從工具箱的頂部放下新控件,替換現有的ListView。

Public Class MyListView 
    Inherits ListView 

    Public Sub New() 
     Me.DoubleBuffered = True 
    End Sub 
End Class 
+0

好極了,請試試看,謝謝! – Joe 2010-09-08 14:52:33