跨线程操作无效:控制从其创建的线程以外的线程访问的“ListView1” [英] Cross-thread operation not valid: Control 'ListView1' accessed from a thread other than the thread it was created on

查看:72
本文介绍了跨线程操作无效:控制从其创建的线程以外的线程访问的“ListView1”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将列表视图项目导出到Excel工作表,每件事情都很完美但是当我在后台工作者中尝试这样做时我遇到了这个错误:



System.Windows.Forms.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理



其他信息:跨线程操作无效:控制'ListView1'从其创建的线程以外的线程访问。



i dint知道如何解决这个问题,请帮助我:)



这是我的代码:



 私有  Sub  PictureBox2_Click(发件人作为 对象,e  As  EventArgs)句柄 PictureBox2.Click 
尝试
saveFileDialog1.Fi lter = Excel文件| * .xlsx
saveFileDialog1.Title = 保存Excel文件
Application.EnableVisualStyles()
如果 saveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK 那么
如果 saveFileDialog1.FileName<> 然后
PictureBox1 .Visible = True
BackgroundWorker1.RunWorkerAsync()

结束 如果
结束 如果
Catch ex As 异常
MsgBox(ex.Message)
< span class =code-keyword>结束 尝试
结束 Sub


私有 Sub BackgroundWorker1_DoWork(发件人作为 对象,e 作为 System.ComponentModel.Do WorkEventArgs)句柄 BackgroundWorker1.DoWork
saveExcelFile(SaveFileDialog1.FileName)
结束 < span class =code-keyword> Sub

私有 Sub BackgroundWorker1_RunWorkerCompleted(sender As Object ,e As System.ComponentModel.RunWorkerCompletedEventArgs)句柄 BackgroundWorker1.RunWorkerCompleted
PictureBox1.Visible = False
MessageBox.Show( DONE !!
结束 Sub

公共 Sub saveExcelFile( ByVal FileNam e 作为 字符串
' 尝试
Dim xls As Excel.Application
Dim As Excel.Worksheet
Dim i As 整数
xls.Workbooks.Add()
sheet = xls.ActiveWorkbook.ActiveSheet
Dim row < span class =code-keyword> As 整数 = 1
< span class =code-keyword> Dim col 作为 整数 = 1
对于 i = 0 Me .ListView1.Columns。计数 - 1
sheet.Cells( 1 ,i + 1 )= Me .ListView1.Columns(i).Text
Next
对于 i = 0 .ListView1.Items.Count - 1
对于 j = 0 .ListView1.Items(i).SubItems.Count - 1 ' < span class =code-comment>这里是ERROR !!
sheet.Cells(i + 2 ,j + 1 )= Me .ListView1.Items(i).SubItems(j).Text
下一步
下一步

row + = 1
col = 1

' 标题
sheet.Rows( 1 )。Font.Name = Microsoft Sans Serif
sheet.Rows( 1 )。Font.size = 16
sheet.Rows( 1 )。 Font.Bold = True
sheet.Rows( 1 )。Horizo​​ntalAlignment = Excel.XlVAlign。 xlVAlignCenter
Dim mycol As System.Drawing.Color = System.Dra wing.ColorTranslator.FromHtml( #20b2aa
sheet.Rows( 1 )。Font.color = mycol
' for all没有标题的工作表
sheet.Range( a2 z1000)。Font.Name = Arial
sheet.Range( a2 z1000)。Font.Size = 14
sheet.Range( a2 z1000)。Horizo​​ntalAlignment = Excel.XlVAlign.xlVAlignCenter

she et.Range( A1:X1)。EntireColumn.AutoFit()
sheet。范围( A1:X1)。EntireRow.AutoFit()

xls.ActiveWorkbook.SaveAs(FileName)
xls.Workbooks.Close()
xls.Quit()
' Catch ex As Exception
' MsgBox(ex.Message)
' 结束尝试
结束 Sub

解决方案

参见 https://msdn.microsoft.com/en-us/library/ vstudio / ms171728%28v = vs.100%29.aspx [ ^ ]。




使用线程并从中您可以从被调用的线程访问您的UI线程。



例如:

  private   void  ackgroundWorker1_DoWork(发件人为对象,e为系统。 ComponentModel.DoWorkEventArgs)
{
ThreadPool.QueueWorkerProcress( new WaitCallback(saveExcelFile));
}

private void saveExcelFile( object obj)
{
你的工作();将数据更新到UI时

使用以下代码

.beginInvoke( new MethodInvoker(updateUI));

}
private void updateUI()
{
您的更新UI代码。

}


我编辑了你想象的代码...

请试试吧工作。



问候

拉尔夫



<前郎= vb> 私有 Sub PictureBox2_Click(发件人 As 对象,e 作为 EventArgs)句柄 PictureBox2.Click
尝试
SaveFileDialog1.Filter = Excel文件| * .xlsx
SaveFileDialog1.Title = 保存Excel文件
Application.EnableVisualStyles()
如果 SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK 然后
如果 SaveFileDialog1.FileName<> 然后
PictureBox2 .Visible = True

ListView_Columns = ListView1.Columns
ListView_Items = ListView1.Items

BackgroundWorker1。 RunWorkerAsync()

结束 如果
结束 如果
Catch ex As 异常
MsgBox(ex.Message)
结束 尝试
结束 Sub

私有 ListView_Columns As System.Windows.Forms.ListView.ColumnHead erCollection
Private ListView_Items As System.Windows.Forms.ListView.ListViewItemCollection


私有 Sub BackgroundWorker1_DoWork(发件人正如 对象,e As System.ComponentModel.DoWorkEventArgs)句柄 BackgroundWorker1.DoWork
saveExcelFile(SaveFileDialog1.FileName)
结束 Sub

私有 Sub BackgroundWorker1_RunWorkerCompleted(sender As Object ,e As System.ComponentModel.RunWorkerCompletedEventArgs)< span class =code-keyword>句柄
Backgr oundWorker1.RunWorkerCompleted
PictureBox2.Visible = False
MessageBox.Show( < span class =code-string> DONE !!)
结束 Sub

公共 Sub saveExcelFile( ByVal FileName 作为 字符串
' 尝试
Dim xls 作为 Excel.Application
Dim As Excel.Worksheet
Dim i As < span class =code-keyword> Integer
xls.Workbooks。 Add()
sheet = xls.ActiveWorkbook.ActiveSheet
Dim row As < span class =code-keyword>整数 = 1
Dim col 作为 整数 = 1
对于 i = 0 ListView_Columns.Count - 1
sheet.Cells( 1 ,i + 1 )= ListView_Columns(i).Text
Next
For i = 0 ListView_Items.Count - 1
对于 j = 0 ListView_Items(i).SubItems.Count - 1 ' 这里的错误!!
sheet.Cells(i + 2 ,j + 1 )= ListView_Items(i).SubItems(j).Text
Next
下一步

row + = 1
col = 1

' 标题
sheet.Rows( 1 )。Font.Name = Microsoft Sans Serif
sheet.Rows( 1 )。Font.size = 16
sheet.Rows( 1 )。Font.Bold = True
sheet.Rows( 1 )。Horizo​​ntalAlignment = Excel.XlVAlign.xlVAlignCenter
Dim mycol As System.Drawing.Color = System.Drawing.ColorTranslator.FromHtml( #20b2aa
sheet.Rows( 1 )。Font.color = mycol
' 所有不带标题的工作表
sheet.Range(< span class =code-string> a2 z1000)。Font.Name = Arial
sheet.Range( a2 z1000)。Font.Size = 14
sheet.Range( a2 z1000)。Horizo​​ntalAlignment = Excel.XlVAlign.xlVAlignCenter

sheet.Range( A1:X1)。EntireColumn.AutoFit()
sheet.Range( A1:X1)。EntireRow.AutoFit()

xls.ActiveWorkbook.SaveAs(FileName)
xls.Workbooks.Close()
xls.Quit()

' 从前捕获例外
' MsgBox(ex.Message)
' 结束尝试
结束 Sub


i'm trying to export list view item to excel sheet, every thing work perfect but when I'm trying to do this in background worker i face this error :

An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code

Additional information: Cross-thread operation not valid: Control 'ListView1' accessed from a thread other than the thread it was created on.

i dint know how to fix this , please help me :)

this is my code :

Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click
    Try
        saveFileDialog1.Filter = "Excel File|*.xlsx"
        saveFileDialog1.Title = "Save an Excel File"
        Application.EnableVisualStyles()
        If saveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            If saveFileDialog1.FileName <> "" Then
                PictureBox1.Visible = True
                BackgroundWorker1.RunWorkerAsync()

            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub


Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    saveExcelFile(SaveFileDialog1.FileName)
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    PictureBox1.Visible = False
    MessageBox.Show("DONE !!")
End Sub

Public Sub saveExcelFile(ByVal FileName As String)
    'Try
    Dim xls As New Excel.Application
    Dim sheet As Excel.Worksheet
    Dim i As Integer
    xls.Workbooks.Add()
    sheet = xls.ActiveWorkbook.ActiveSheet
    Dim row As Integer = 1
    Dim col As Integer = 1
    For i = 0 To Me.ListView1.Columns.Count - 1
        sheet.Cells(1, i + 1) = Me.ListView1.Columns(i).Text
    Next
    For i = 0 To Me.ListView1.Items.Count - 1
        For j = 0 To Me.ListView1.Items(i).SubItems.Count - 1 ' here the ERROR !!
            sheet.Cells(i + 2, j + 1) = Me.ListView1.Items(i).SubItems(j).Text
        Next
    Next

    row += 1
    col = 1

    ' for the header
    sheet.Rows(1).Font.Name = "Microsoft Sans Serif"
    sheet.Rows(1).Font.size = 16
    sheet.Rows(1).Font.Bold = True
    sheet.Rows(1).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter
    Dim mycol As System.Drawing.Color = System.Drawing.ColorTranslator.FromHtml("#20b2aa")
    sheet.Rows(1).Font.color = mycol
    ' for all the sheet without header
    sheet.Range("a2", "z1000").Font.Name = "Arial"
    sheet.Range("a2", "z1000").Font.Size = 14
    sheet.Range("a2", "z1000").HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter

    sheet.Range("A1:X1").EntireColumn.AutoFit()
    sheet.Range("A1:X1").EntireRow.AutoFit()

    xls.ActiveWorkbook.SaveAs(FileName)
    xls.Workbooks.Close()
    xls.Quit()
    'Catch ex As Exception
    '    MsgBox(ex.Message)
    'End Try
End Sub

解决方案

See https://msdn.microsoft.com/en-us/library/vstudio/ms171728%28v=vs.100%29.aspx[^].


Hi,
Use a thread and from the you can access your UI thread from the called thread.

eg:

 private void ackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
{
     ThreadPool.QueueWorkerProcress(new WaitCallback(saveExcelFile));
}

private void saveExcelFile(object obj)
{
         do your work();

        on updating the data to UI use the below code

         this.beginInvoke(new MethodInvoker(updateUI));

}
private void updateUI()
{
    your update UI code.
 
}


I have edited your code like I think ...
Please try if it is working.

Greetings
Ralf

Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click
    Try
        SaveFileDialog1.Filter = "Excel File|*.xlsx"
        SaveFileDialog1.Title = "Save an Excel File"
        Application.EnableVisualStyles()
        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            If SaveFileDialog1.FileName <> "" Then
                PictureBox2.Visible = True

                ListView_Columns = ListView1.Columns
                ListView_Items = ListView1.Items

                BackgroundWorker1.RunWorkerAsync()

            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Private ListView_Columns As System.Windows.Forms.ListView.ColumnHeaderCollection
Private ListView_Items As System.Windows.Forms.ListView.ListViewItemCollection


Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    saveExcelFile(SaveFileDialog1.FileName)
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    PictureBox2.Visible = False
    MessageBox.Show("DONE !!")
End Sub

Public Sub saveExcelFile(ByVal FileName As String)
    'Try
    Dim xls As New Excel.Application
    Dim sheet As Excel.Worksheet
    Dim i As Integer
    xls.Workbooks.Add()
    sheet = xls.ActiveWorkbook.ActiveSheet
    Dim row As Integer = 1
    Dim col As Integer = 1
    For i = 0 To ListView_Columns.Count - 1
        sheet.Cells(1, i + 1) = ListView_Columns(i).Text
    Next
    For i = 0 To ListView_Items.Count - 1
        For j = 0 To ListView_Items(i).SubItems.Count - 1 ' here the ERROR !!
            sheet.Cells(i + 2, j + 1) = ListView_Items(i).SubItems(j).Text
        Next
    Next

    row += 1
    col = 1

    ' for the header
    sheet.Rows(1).Font.Name = "Microsoft Sans Serif"
    sheet.Rows(1).Font.size = 16
    sheet.Rows(1).Font.Bold = True
    sheet.Rows(1).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter
    Dim mycol As System.Drawing.Color = System.Drawing.ColorTranslator.FromHtml("#20b2aa")
    sheet.Rows(1).Font.color = mycol
    ' for all the sheet without header
    sheet.Range("a2", "z1000").Font.Name = "Arial"
    sheet.Range("a2", "z1000").Font.Size = 14
    sheet.Range("a2", "z1000").HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter

    sheet.Range("A1:X1").EntireColumn.AutoFit()
    sheet.Range("A1:X1").EntireRow.AutoFit()

    xls.ActiveWorkbook.SaveAs(FileName)
    xls.Workbooks.Close()
    xls.Quit()

    'Catch ex As Exception
    '    MsgBox(ex.Message)
    'End Try
End Sub


这篇关于跨线程操作无效:控制从其创建的线程以外的线程访问的“ListView1”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆