vb.net - Cross-thread operation not valid: Control 'ListView1' accessed from a thread other than the thread it was created on -
i'm trying export list view item excel sheet, every thing work perfect when i'm trying in background worker face error :
an exception of type 'system.invalidoperationexception' occurred in system.windows.forms.dll not handled in user code
additional information: cross-thread operation not valid: control 'listview1' accessed thread other thread created on.
i dint know how fix , please me :)
this code :
private sub picturebox2_click(sender object, e eventargs) handles picturebox2.click try savefiledialog1.filter = "excel file|*.xlsx" savefiledialog1.title = "save excel file" application.enablevisualstyles() if savefiledialog1.showdialog = windows.forms.dialogresult.ok if savefiledialog1.filename <> "" picturebox1.visible = true backgroundworker1.runworkerasync() end if end if catch ex exception msgbox(ex.message) end try end sub private sub backgroundworker1_dowork(sender object, e system.componentmodel.doworkeventargs) handles backgroundworker1.dowork saveexcelfile(savefiledialog1.filename) end sub private sub backgroundworker1_runworkercompleted(sender object, e system.componentmodel.runworkercompletedeventargs) handles backgroundworker1.runworkercompleted picturebox1.visible = false messagebox.show("done !!") end sub public sub saveexcelfile(byval filename string) 'try dim xls new excel.application dim sheet excel.worksheet dim integer xls.workbooks.add() sheet = xls.activeworkbook.activesheet dim row integer = 1 dim col integer = 1 = 0 me.listview1.columns.count - 1 sheet.cells(1, + 1) = me.listview1.columns(i).text next = 0 me.listview1.items.count - 1 j = 0 me.listview1.items(i).subitems.count - 1 ' here error !! sheet.cells(i + 2, j + 1) = me.listview1.items(i).subitems(j).text next next row += 1 col = 1 ' 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 system.drawing.color = system.drawing.colortranslator.fromhtml("#20b2aa") sheet.rows(1).font.color = mycol ' 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 exception ' msgbox(ex.message) 'end try end sub hello enigmativity ...
i have small error :
an exception of type 'system.runtime.interopservices.comexception' occurred in noor phone.exe not handled in user code
additional information: unable access file. try 1 of following actions:
• make sure selected folder.
• make sure folder contains file not read-only.
• make sure file name not contain 1 of following codes: <>? []: | or *
• make sure file name , path name not contain more 128 characters.
this code after editing:
private class bgwdata public filename string public headers string() public data string()() end class private sub picturebox2_click(sender object, e eventargs) handles picturebox2.click 'try dim data new bgwdata() _ { _ .filename = savefiledialog1.filename, _ .headers = _ me.listview1.columns _ .cast(of system.windows.forms.columnheader)() _ .select(function(ch) ch.name) _ .toarray(), _ .data = _ me.listview1.items.cast(of listviewitem)() _ .select(function(lvi) lvi.subitems _ .cast(of listviewitem.listviewsubitem)() _ .select(function(lvsi) lvsi.text) _ .toarray()) _ .toarray() _ } 'backgroundworker1.runworkerasync(data) savefiledialog1.filter = "excel file|*.xlsx" savefiledialog1.title = "save excel file" application.enablevisualstyles() if savefiledialog1.showdialog = windows.forms.dialogresult.ok if savefiledialog1.filename <> "" picturebox1.visible = true 'backgroundworker1.runworkerasync() backgroundworker1.runworkerasync(data) end if end if 'catch ex exception ' msgbox(ex.message) 'end try end sub private sub backgroundworker1_dowork(sender object, e system.componentmodel.doworkeventargs) handles backgroundworker1.dowork 'saveexcelfile(savefiledialog1.filename) saveexcelfile(ctype(e.argument, bgwdata)) end sub private sub backgroundworker1_runworkercompleted(sender object, e system.componentmodel.runworkercompletedeventargs) handles backgroundworker1.runworkercompleted picturebox1.visible = false messagebox.show("done !!") end sub private sub saveexcelfile(byval data bgwdata) 'public sub saveexcelfile(byval filename string) 'try dim xls new excel.application dim sheet excel.worksheet dim integer xls.workbooks.add() sheet = xls.activeworkbook.activesheet 'dim row integer = 1 'dim col integer = 1 'for = 0 me.listview1.columns.count - 1 ' sheet.cells(1, + 1) = me.listview1.columns(i).text 'next 'for = 0 me.listview1.items.count - 1 ' j = 0 me.listview1.items(i).subitems.count - 1 ' here error !! ' sheet.cells(i + 2, j + 1) = me.listview1.items(i).subitems(j).text ' next 'next dim row integer = 1 dim col integer = 1 = 0 data.headers.length - 1 sheet.cells(1, + 1) = data.headers(i) next = 0 data.data.length - 1 j = 0 data.data(i).length - 1 sheet.cells(i + 2, j + 1) = data.data(i)(j) next next row += 1 col = 1 ' 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 system.drawing.color = system.drawing.colortranslator.fromhtml("#20b2aa") sheet.rows(1).font.color = mycol ' 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.activeworkbook.saveas(data.filename)'**here error** xls.workbooks.close() xls.quit() marshal.releasecomobject(sheet) marshal.releasecomobject(xls) 'catch ex exception ' msgbox(ex.message) 'end try end sub
you should make sure when access elements of ui on ui thread otherwise can error you're experiencing.
the easiest way avoid issue separate out code reads data ui , code writes excel file.
first start defining simple class hold data:
private class bgwdata public filename string public headers string() public data string()() end class i defined inside form class doesn't need exposed outside of form.
now code calls background worker needs change instance of bgwdata created, populated data listview, file name, , sent worker argument.
dim data new bgwdata() _ { _ .filename = savefiledialog1.filename, _ .headers = _ me.listview1.columns _ .cast(of system.windows.forms.columnheader)() _ .select(function(ch) ch.name) _ .toarray(), _ .data = _ me.listview1.items.cast(of listviewitem)() _ .select(function(lvi) lvi.subitems _ .cast(of listviewitem.listviewsubitem)() _ .select(function(lvsi) lvsi.text) _ .toarray()) _ .toarray() _ } backgroundworker1.runworkerasync(data) this code runs in picturebox2_click still on ui thread.
the backgroundworker1_dowork method changes call saveexcelfile this:
saveexcelfile(ctype(e.argument, bgwdata)) the signature saveexcelfile changes private sub saveexcelfile(byval data bgwdata)
and code populates spreadsheet becomes:
dim row integer = 1 dim col integer = 1 = 0 data.headers.length - 1 sheet.cells(1, + 1) = data.headers(i) next = 0 data.data.length - 1 j = 0 data.data(i).length - 1 sheet.cells(i + 2, j + 1) = data.data(i)(j) next next and, of course, there small change saveas method call become:
xls.activeworkbook.saveas(data.filename) also, side note, keep in mind need release com objects after use them too:
marshal.releasecomobject(sheet); marshal.releasecomobject(xls);
Comments
Post a Comment