2011-02-21 27 views
0

サブリストをスレッドセーフな方法でリストビューに追加しようとしています。シングルスレッドのアプリケーションでVB.netスレッドセーフな方法でリストビューのサブアイテムを追加するには?

は、それはそうのように動作します:別のスレッドで実行する場合

For i As Integer = 0 to lvMembers.Items.Count - 1 
    Dim lv As ListViewItem = lvMembers.Items(i) 
    Dim str As String = lv.Text.ToString 
    If str.Contains("value") 
    lv.SubItems.Add("OK") 
    lv.SubItems(0).ForeColor = Color.Green 

    Else 
    lv.SubItems.Add("FAILED") 
    lv.SubItems(0).ForeColor = Color.Red 

    End If 
    Next 

しかし、それは、クロススレッドエラーが発生します。

私はInvokeを使用するデリゲートサブの例を見てきましたが、私が見たすべての例ではオブジェクトのテキストプロパティを更新する必要があります。実際にサブアイテムを追加するコンセプトを適用する方法リストビュー。

ご協力いただきありがとうございます。ここで

+0

私は、問題が表示されません。あなたはどのように代議員を使うのですか? –

+0

まあ私の問題は、メインUI以外のスレッドでこれを実行すると、クロススレッド例外がスローされます。 2行目で失敗した場合、私は私のアプローチ全体を変えなければならないと思いますが、どこから始めるべきか分かりません。 – Steve

答えて

1

は、私は私自身の使用のために何度も何度も使用例です。それは渡す変数をサポートします。この例では私のリストビューは1つの項目と2つのサブ項目(サイト、グループ、ページランク)を持っているので、あなた自身の使用のためにそれを変更します。

デリゲートを:

Private Delegate Sub ListViewAddItem_delegate(ByVal name As String, ByVal group As String, ByVal pagerank As String) 
Private Sub ListViewAddItem(ByVal name As String, ByVal group As String, ByVal pagerank As String) 
    If Me.ListView1.InvokeRequired Then 
     Dim d As New ListViewAddItem_delegate(AddressOf ListViewAddItem) 
     Me.ListView1.BeginInvoke(d, {name, group, pagerank}) 
    Else 
     Dim lvi As New ListViewItem(name) 
     lvi.SubItems.Add(group) 
     lvi.SubItems.Add(pagerank) 
     ListView1.Items.AddRange(New ListViewItem() {lvi}) 
     ListView1.Update() 
    End If 
End Sub 

それを呼び出す方法:

Dim Name as string = "Test" 
Dim Group As String = "TestGroup" 
Dim PR As String = "10" 
ListViewAddItem(Name, Group, PR) 

は、私はちょうどListViewAddItemを呼び出すときに名前のグループPRが文字列であったことを示すために()

私は答えが選択されていない気づいを「薄暗いXXX文字列として」ものを追加しました。私たちのすべての恩恵を受け、1つを選んでください!ありがとう!リストビューに新規のListViewItemを追加する

0
Private delegate sub deladdtolist 

Private sub addtolist 
    If InvokeRequired Then 
    del.Invoke(new deladdtolist(AddressOf addtolist)) 
    else 
    For i As Integer = 0 to lvMembers.Items.Count - 1 
    Dim lv As ListViewItem = lvMembers.Items(i) 
    Dim str As String = lv.Text.ToString 
    If str.Contains("value") 
    lv.SubItems.Add("OK") 
    lv.SubItems(0).ForeColor = Color.Green 

    Else 
    lv.SubItems.Add("FAILED") 
    lv.SubItems(0).ForeColor = Color.Red 

    End If 
    Next 
    End If 
End Sub 
0

簡単な例

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, _ 
          ByVal e As System.EventArgs) Handles MyBase.Load 

     'sample data for the ListView 
     Dim ipsumA() As String = New String() {"Lorem", "ipsum", "dolor", "sit", _ 
               "amet", "consectetur", "adipisicing", _ 
               "elit", "sed", "do", "eiusmod", _ 
               "tempor", "incididunt", "ut", "labore", _ 
               "et", "dolore", "magna", "aliqua", "Ut", _ 
               "enim", "ad", "minim", "veniam", "quis", _ 
               "nostrud", "exercitation", "ullamco", _ 
               "laboris", "nisi", "ut", "aliquip", "ex", _ 
               "ea", "commodo", "consequat", "Duis", "aute", _ 
               "irure", "dolor", "in", "reprehenderit", "in", _ 
               "voluptate", "velit", "esse", "cillum", "dolore", _ 
               "eu", "fugiat", "nulla", "pariatur", "Excepteur", _ 
               "sint", "occaecat", "cupidatat", "non", "proident", _ 
               "sunt", "in", "culpa", "qui", "officia", "deserunt", _ 
               "mollit", "anim", "id", "est", "laborum"} 

     Dim lvi As New List(Of ListViewItem) 

     For Each s As String In ipsumA 
      Dim nLVI As New ListViewItem(s) 
      lvi.Add(nLVI) 
     Next 

     ListView1.Items.AddRange(lvi.ToArray) 

     'colorize from another thread 
     Dim t As New Threading.Thread(AddressOf thrd) 
     t.Start() 

    End Sub 

    Private Sub thrd() 
     If ListView1.InvokeRequired Then 
      ListView1.BeginInvoke(New MethodInvoker(AddressOf thrd)) 
     Else 
      For i As Integer = 0 To ListView1.Items.Count - 1 
       Dim lv As ListViewItem = ListView1.Items(i) 
       Dim str As String = lv.Text.ToString 
       If str.ToLower.Contains("ut") Then 
        lv.SubItems.Add("OK") 
        lv.SubItems(0).ForeColor = Color.Green 

       Else 
        lv.SubItems.Add("FAILED") 
        lv.SubItems(0).ForeColor = Color.Red 
       End If 
      Next 
     End If 
    End Sub 
End Class 
1

スレッドセーフな簡単な方法:

Private Sub AddListViewItem(ByVal name As String, ByVal subitem1 As String, ByVal subitem2 As String) 
    ListView1.BeginInvoke(Sub() 
           Dim lvi As New ListViewItem(name) 
           lvi.SubItems.Add(subitem1) 
           lvi.SubItems.Add(subitem2) 
           ListView1.Items.AddRange(New ListViewItem() {lvi}) 
          End Sub) 
End Sub 
関連する問題