2014-01-24 2 views
1

im는 csv 파일을 읽고 DataGridView 구성 요소에 내용을 표시하는 vb.net의 간단한 WinForm 응용 프로그램을 만듭니다. 아래 코드는 메인 UI 스레드에서 실행됩니다.seprate 스레드에서 rows.insert를 사용하는 이상한 동작

For Each line In fileinput 
    Dim elements = line.Split(",") 
    DataGridView1.rows.insert(0,elements) 
Next 

위의 코드는 주 양식 스레드에서 올바르게 작동합니다. 요소 배열은 각 행의 모든 ​​셀을 채우는 데 사용되지만 별도의 스레드에서 동일한 코드를 사용하면 각 행의 첫 번째 셀에 모두 들어갑니다. System.String []. 왜 이런 일이 일어날 지 아무도 몰라? 당신이 변화 할 때

Me.Invoke(Sub() 
      DataGridView1.Rows.Insert(0, elements) 
      End Sub) 

: 문자열로

희미한 파일 이름 = ""

Private Sub BtnCsv_Click(sender As Object, e As EventArgs) Handles BtnCsv.Click 

    Opf.ShowDialog() 
    Filename = Opf.FileName 

    Dim t As Thread 
    t = New Thread(AddressOf Me.ParseFileThread) 
    t.Start() 



End Sub 

Public Sub ParseFileThread() 

    'RtfOut.Text = Filename 

    'Read All Lines From The File since Its a csv 
    Dim inputFile() = File.ReadAllLines(Filename) 
    'The first line contains the headers for the csv file 
    Dim headers() = inputFile(0).Split(",") 

    SetGridHeaders(headers) 
    SetDataGrid(inputFile) 

End Sub 

Public Delegate Sub SetGridHeadersDelegate(ByVal headers As Array) 

Public Sub SetGridHeaders(ByVal headers As Array) 
    If Dgv.InvokeRequired Then 
     Dgv.BeginInvoke(New SetGridHeadersDelegate(AddressOf SetGridHeaders), headers) 
    Else 
     For Each header In headers 
      Dgv.Columns.Add(header, header) 
      Dgv.Refresh() 
     Next 
    End If 
End Sub 

Public Delegate Sub SetDataGridDelegate(ByVal values As Array) 

Public Sub SetDataGrid(ByVal values As Array) 
    If Dgv.InvokeRequired Then 
     Dgv.BeginInvoke(New SetDataGridDelegate(AddressOf SetDataGrid), values) 
    Else 
     For Each line In values 
      Dim cells = line.Split(",") 
      Dgv.Rows.Insert(0, cells) 
      Dgv.Refresh() 
     Next 
    End If 
End Sub 

답변

1

이 시도 : 여기

만들고 새 스레드에서 실행되는 전체 코드가 활성 UI 스레드에 대한 제어. 변경 사항은 해당 스레드 자체 내에서 발생해야합니다. 그렇지 않으면 문제가 발생합니다. 나는 예외를 던지지 않고 코드가 실행되었다는 것에 놀랐다.

Me.Invoke는 데이터가 주 스레드에 채워져 있는지 확인합니다.

+0

나는 이미 그것을 시도했다. 그것이 내가 처음에는 이상한 행동을 취하는 방법입니다. 그래도 답장을 보내 주셔서 감사합니다. – CelestialDog

+0

알았어. 나는 그걸 다시 가져 간다. 내 스레드 코드를 제거하고 대신 당신의 코드를 사용하면 완벽하게 작동합니다. 정말 고맙습니다! – CelestialDog

+0

반갑습니다. :-) –

관련 문제