2011-02-21 11 views
0

하위보기를 threadsafe 방식으로 listview에 추가하려고합니다. 단일 스레드 응용 프로그램에서VB.net 스레드 안전 메서드를 사용하여 listview 하위 항목을 추가 하시겠습니까?

는 그렇게처럼 작동 : 다른 스레드에서 실행하는 경우

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의 스레드 이외의 다른 이걸 실행하는 경우, 그것은 크로스 스레딩 예외를 throw합니다. 두 번째 줄에서 오류가 발생하면 내 전체 접근 방식을 변경해야하지만 어디서부터 시작해야할지 모릅니다. – Steve

답변

1

내가 내 자신의 용도에 또 다시 사용하는 예입니다. 변수 전달을 지원합니다. 이 예에서 내 목록보기 1 개 항목 2 개 하위 항목 (사이트, 그룹, 페이지 랭크 (PageRank))을 가지고 있으므로 자신의 용도 수정 :

대리인 :

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 문자열로"물건을 추가했다. 우리 모두 호의를 베풀어 하나를 선택하십시오! 감사! ListView가에 새 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