跨线程操作无效:控制从其创建的线程以外的线程访问的“ListView1” [英] Cross-thread operation not valid: Control 'ListView1' accessed from a thread other than the thread it was created on
问题描述
我正在尝试将列表视图项目导出到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 )。HorizontalAlignment = 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)。HorizontalAlignment = 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 )。HorizontalAlignment = 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)。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()
' 从前捕获例外
' 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屋!