2013-05-10 44 views
0

我想要刪除不包含「mysite」的列表框中的所有項目,並且這裏是我的代碼工作正常,但沒有backgroundworker使用backgroundworker從列表框中刪除項目

做工作事件:

Dim relevantSite As Integer = 0 
Do Until relevantSite = lstLinks.Items.Count 
    If lstLinks.Items.Item(relevantSite).ToString.Contains("mysite") Then 
     relevantSite += 1 
    Else 
     bgWorker.ReportProgress(relevantSite) 
    End If 
Loop 

ProgressChanged事件:

lstLinks.Items.RemoveAt(CInt(e.ProgressPercentage)) 

它是什麼,它消除了很多項目,有時所有項目。我知道我在用ereportProgress這個東西犯了一些可怕的錯誤。

請他們向我解釋,我搜索各個網站,但無法理解......

+0

你的許多項目如何包含字符串「mysite的」。如果有很多,那麼你的代碼工作正常。請指教。還要注意ReportProgress的第一個參數是操作進度的一個指示。第二個參數UserState是您應該用來傳遞索引的值。 – Ric 2013-05-10 15:21:18

+1

你爲什麼使用後臺工作者?我看不到它在這裏增加任何價值,因爲進度改變事件比DoWork要重得多。有沒有額外的處理,你沒有顯示?你不能只在初始加載中過濾網站嗎? – PatFromCanada 2013-05-10 16:43:28

+1

您希望ProgressChanged事件處理程序在您調用ReportProgress時運行。它不會,它會在稍後運行。確實搞砸了listview。不要使用工人代碼這樣。 – 2013-05-10 20:42:06

回答

0

,而不是你應該建立在你的後臺工作一個新的列表清單直接更改項目。這樣,您可以從列表中添加刪除項目,並在所有處理完成後將其返回到用戶界面並重新綁定下拉列表。

0

您期望代碼的行爲就好像它是同步的。但多線程不能這樣工作。

您的代碼在做工作將在報告進度完成之前處理下一條記錄。換句話說,循環不會暫停並等待報告進度完成。這是一個問題,因爲當你調出來從列表中刪除一個項目時,如果項目不見了,你可以重新使用索引。經過幾次清除後,通過的索引將不會顯示正確的項目。如果你要使用標識符而不是索引,它將起作用。但是整個事情對我來說似乎是錯誤的,因爲你在做工作方法上沒有做任何繁重的工作。

+0

爲了更加清晰,我做了一些修改。 – PatFromCanada 2013-05-10 19:50:29

0

我要刪除不包含 「mysite的」

走在列表框向後和刪除有問題的項目,當您去一個列表框的所有項目。裹在的BeginUpdate()和EndUpdate()的過程中,所以當你完成所有操作列表框只刷新一次:

lstLinks.BeginUpdate() 
    Dim NumItems As Integer = lstLinks.Items.Count - 1 
    For i As Integer = NumItems To 0 Step -1 
     If Not lstLinks.Items(i).ToString.Contains("mysite") Then 
      lstLinks.Items.RemoveAt(i) 
     End If 
    Next 
    lstLinks.EndUpdate() 
    lstLinks.Refresh()