2016-01-31 65 views
0

從閱讀ListView中的項目時遇到問題。 ListView位於主線程中,而我讀出的部分位於另一個類和另一個線程中。我的代碼如下:從Visual Basic中的另一個線程讀取ListView中的信息

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim ltm As ListViewItem = New ListViewItem 
     ltm.Text = "test1" 
     ltm.SubItems.Add("test2") 
     ltm.SubItems.Add("test3") 
     Me.ListView2.Items.Add(ltm) 
     Dim l As New test 
     Dim x As New Threading.Thread(AddressOf l.readout) 
    End Sub 
End Class 
Public Class test 
    Public Sub readout() 
     For Each i As ListViewItem In Form1.ListView2.Items 
      Dim command As String = i.SubItems(0).Text 
      Dim value As String = i.SubItems(1).Text 
      Dim executeon As String = i.SubItems(2).Text 
      MsgBox(command & vbCrLf & value & vbCrLf & executeon) 
     Next 
    End Sub 
End Class 

我聽說過調用並找到一些示例代碼。我也嘗試以下:

Dim selectedItem = CStr((New Func(Of String)(Function() Form1.ListView2.Items(0).Text)).Invoke) 
     MsgBox(selectedItem) 

但是,這也沒有工作。沒有錯誤消息,它只是不顯示任何消息框。當我刪除線程和相同的類時,它工作得很好。有誰知道它爲什麼不起作用?

+0

標準VB.NET錯誤,在工作線程中使用Form1會創建一個Form1類的* new *實例。除非添加Form1.ShowDialog(),否則無法看到它。如果你修復這個bug,那麼你會得到InvalidOperationException。不要在工作線程中混淆UI,給它一個List(Of String)來處理。 –

回答

0

基本上,你不能觸摸另一個線程的UI線程。很難準確地告訴你正在嘗試做什麼,但是你可以肯定地檢查你是否在非UI線程上,並使用InvokeRequired和BeginInvoke繼續在UI線程上執行。

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim ltm As ListViewItem = New ListViewItem 
     ltm.Text = "test1" 
     ltm.SubItems.Add("test2") 
     ltm.SubItems.Add("test3") 
     Me.ListView2.Items.Add(ltm) 
     Dim l As New test(ListView2) 
     Dim x As New Threading.Thread(AddressOf l.readout) 
     x.Start() 
    End Sub 
End Class 

Public Class test 

    Public Sub New(listview As ListView) 
     _listview = listview 
    End Sub 

    Private _listview As ListView 

    Public Sub readout() 
     If _listview.InvokeRequired Then 
      _listview.BeginInvoke(New Action(AddressOf readout)) 
     Else 
      For Each i As ListViewItem In Form1.ListView2.Items 
       Dim command As String = i.SubItems(0).Text 
       Dim value As String = i.SubItems(1).Text 
       Dim executeon As String = i.SubItems(2).Text 
       MsgBox(command & vbCrLf & value & vbCrLf & executeon) 
      Next 
     End If 
    End Sub 
End Class 
+0

這幫了我很多。謝謝你的回答,你救了我! –

+0

我被困在另一個問題上了。提供的代碼是一個測試項目,因爲實際的代碼太大而無法顯示。在測試項目中,它工作得很好,但在實際中它給了我一個null參考錯誤。任何線索可能是什麼? –