首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在独立线程上使用rows.insert的奇怪行为

在独立线程上使用rows.insert的奇怪行为
EN

Stack Overflow用户
提问于 2014-01-24 20:42:15
回答 1查看 56关注 0票数 1

我在vb.net中创建了一个简单的vb.net应用程序,它读取csv文件并将其内容显示在DataGridView组件中。下面是我在主ui线程上运行的代码。

代码语言:javascript
代码运行次数:0
运行
复制
For Each line In fileinput
  Dim elements = line.Split(",")
  DataGridView1.rows.insert(0,elements)
Next

以上代码在主窗体线程上运行良好。元素数组用于填充每一行中的所有单元格,但是如果我在单独的线程上尝试使用相同的代码,那么在每一行的第一个单元格中得到的全部都是System.String[]。有人知道为什么会这样吗?

下面是在一个新线程上创建和运行的整个代码:

文件名为String = "“

代码语言:javascript
代码运行次数:0
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-24 20:53:34

试试这个:

代码语言:javascript
代码运行次数:0
运行
复制
Me.Invoke(Sub()
          DataGridView1.Rows.Insert(0, elements)
          End Sub)

当您在活动UI线程上更改控件时,需要在该线程内部发生更改,否则会遇到问题。我感到惊讶的是,代码执行时没有抛出异常。

Me.Invoke将确保在主线程上填充数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21342125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档