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

Popular posts from this blog

java - Spring Data JPA: Why findOne(id) executing delete query internally? -

python - Mongodb How to add addtional information when aggregating? -

java - Incorrect order of records in M-M relationship in hibernate -