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
나는 이미 그것을 시도했다. 그것이 내가 처음에는 이상한 행동을 취하는 방법입니다. 그래도 답장을 보내 주셔서 감사합니다. – CelestialDog
알았어. 나는 그걸 다시 가져 간다. 내 스레드 코드를 제거하고 대신 당신의 코드를 사용하면 완벽하게 작동합니다. 정말 고맙습니다! – CelestialDog
반갑습니다. :-) –