我在vb.net中创建了一个简单的vb.net应用程序,它读取csv文件并将其内容显示在DataGridView组件中。下面是我在主ui线程上运行的代码。
For Each line In fileinput
Dim elements = line.Split(",")
DataGridView1.rows.insert(0,elements)
Next
以上代码在主窗体线程上运行良好。元素数组用于填充每一行中的所有单元格,但是如果我在单独的线程上尝试使用相同的代码,那么在每一行的第一个单元格中得到的全部都是System.String[]。有人知道为什么会这样吗?
下面是在一个新线程上创建和运行的整个代码:
文件名为String = "“
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
发布于 2014-01-24 12:53:34
试试这个:
Me.Invoke(Sub()
DataGridView1.Rows.Insert(0, elements)
End Sub)
当您在活动UI线程上更改控件时,需要在该线程内部发生更改,否则会遇到问题。我感到惊讶的是,代码执行时没有抛出异常。
Me.Invoke将确保在主线程上填充数据。
https://stackoverflow.com/questions/21342125
复制