2011-08-16 16 views
1

私はListViewを持つアプリケーションを持っており、ListViewの各項目をループしたいと思っています。しかし、私は別のスレッドでこれをやりたいバックグラウンドスレッドでリストビューを反復処理するにはどうすればよいですか?

これは、コードの非常に単純なバージョンがある - が、その誤差は同じです:

次のエラーが発生
Private Sub StartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartToolStripMenuItem.Click 
    pingThread = New Thread(AddressOf loopingRoutine) 
    pingThread.Start() 
End Sub 

Public Sub loopingRoutine() 
    For Each item As ListViewItem In ListView1.Items 
     MsgBox(item.Text) 
    Next 
End Sub 

Cross-thread operation not valid: Control 'ListView1' accessed from a thread other than the thread it was created on.

なぜこれが事実ですか? DataGridViewを使用する前にこの問題が発生したことはありません。

誰かがそれに光を当てることはできますか?

答えて

2

バックグラウンドスレッドからWinFormsアイテムにアクセスすることはできません。それらはUIスレッドにアフィニティ化されています。あなたが過去にこれを異なるタイプで行うことができたのであれば、それはうまくいきました。

特定のコントロールで作業したい場合はいつでも、メンバーにアクセスするにはInvoke UIスレッドに戻る必要があります。バックグラウンドスレッドでは、メンバーをループするなどのアクションを実行することはできません。

+0

感謝を十分です...私は行くつもり私はそれを理解するので、マルチスレッドを研究してください。 –

0

方法があります。うまくいけば、私はこれを解決しようとするネットを見て他の誰かを助けることができます!

デリゲートスレッドを使用してアイテムを呼び出し、リストとして格納する必要があります。もしそれが意味をなさないなら、それを使ってください!そのよう

Private Sub StartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartToolStripMenuItem.Click 
    pingThread = New Thread(AddressOf loopingRoutine) 
    pingThread.Start() 
End Sub 

Public Sub loopingRoutine() 
    Dim myList = DirectCast(Invoke(New GetListViewDelegate(AddressOf GetListViewItems)), List(Of String)) 
    For Each item As String In myList 
     Dim array() As String = item.Split(";") 
     MsgBox(array(0) & vbCrLf & array(1)) 
    Next 
End Sub 

Private Delegate Function GetListViewDelegate() As List(Of String) 
Public Function GetListViewItems() As List(Of String) 
    Return the list back to the delegate 
    Dim pathList = New List(Of String) 
    For Each item As ListViewItem In ListView1.Items 
     pathList.Add(item.Text & ";" & item.Index) 
    Next 
    Return pathList 
End Function 

それはそれを行うための最善の方法ではないかもしれない - しかし、迅速かつ汚いプログラムのために、それは:)

関連する問題