c# - DataGridView form shows up empty after background worker finish -
need ask i'm struggling long now. have gone on many tutorials can't figure out yet...
in first stage of proyect developed console program makes requests web server, processes data , updates ms access db. problem arise after doing processing, need show result inside winform clients see it, , more process should going on , on again while app opened.
so i've done far creating winform runs console program background worker , results should shown , updated program keeps running. simplicity, i'm replacing heavy processing loop fills in list of hashtables, returned winform displayed:
namespace thenamespace { class aldeloupdater { [stathread] static void main() { application.enablevisualstyles(); application.setcompatibletextrenderingdefault(false); application.run(new guiform()); } public list<hashtable> oldmain() { list<hashtable> products = new list<hashtable>(); try { hashtable product1 = new hashtable(); hashtable product2 = new hashtable(); hashtable product3 = new hashtable(); product1.add("productname", "empanada de pollo"); product1.add("username", "fabio roman"); product1.add("dateandtime", "2016-08-11 15:50:52"); product1.add("domiciliosorderid", "1932211-20160811155052"); products.add(product1); product2.add("productname", "empanada de carne"); ... products.add(product2); product3.add("productname", "empanada mixta"); ... products.add(product3); console.writeline("a message debugging."); console.readline(); return products; } catch (exception e) { console.writeline("exception details: " + e.tostring()); console.readline(); return products; } } // more methods , classes }
now winform i've got this:
using system; using system.collections; using system.collections.generic; using system.componentmodel; using system.linq; using system.windows.forms; namespace thenamespace { public partial class guiform : form { public list<hashtable> datagridviewproducts; public guiform() { initializecomponent(); initializebackgroundworker(); backgroundworker.runworkerasync(); // initialize whole process. } // set backgroundworker object // attaching event handlers. private void initializebackgroundworker() { backgroundworker.dowork += new doworkeventhandler(backgroundworker_dowork); backgroundworker.runworkercompleted += new runworkercompletedeventhandler(backgroundworker_runworkercomplet); } private void datagridview1_cellcontentclick(object sender, datagridviewcelleventargs e) { } private void guiform_load(object sender, eventargs e) { int index = 0; if (datagridviewproducts != null && !datagridviewproducts.any()) { foreach (hashtable product in datagridviewproducts) { datagridview1.readonly = false; datagridview1.rows.add(); datagridview1.rows[index].cells[0].value = product["productname"]; datagridview1.rows[index].cells[1].value = product["username"]; datagridview1.rows[index].cells[2].value = product["dateandtime"]; datagridview1.rows[index].cells[3].value = product["domiciliosorderid"]; index++; } return; } } private void button1_click(object sender, eventargs e) { // logic delete-button } private void backgroundworker_dowork(object sender, doworkeventargs e) { aldeloupdater aldelothread = new aldeloupdater(); this.datagridviewproducts = aldelothread.oldmain(); //this.guiform_load(); // ¿do need make call? ¿how to? this.show(); } private void backgroundworker_runworkercomplet(object sender, runworkercompletedeventargs e) { if (e.error != null) { messagebox.show(e.error.message); } else { messagebox.show(e.result.tostring()); } } } }
i've been expecting result:
but instead i'm getting this:
i know i'm doing wrong, don't know , how well, i'm php back-end dev , first c# program. please help.
without minimal, complete, , verifiable code example, it's impossible know sure best solution. based on code posted above, can provide suggestions:
- there doesn't appear need
oldmain()
instance method. can makepublic static list<hashtable> oldmain()
, callaldeloupdater.oldmain()
. better, create separate class method, rather putting in otherwise mainprogram
class. you wrote comment reading "do need make call? how to?". answer "yes, need make call." since method has access ui objects,
datagridview1
object, should call inrunworkercompleted
event handler:private void backgroundworker_runworkercomplet(object sender, runworkercompletedeventargs e) { if (e.error != null) { messagebox.show(e.error.message); } else { messagebox.show(e.result.tostring()); guiform_load(sender, e); } }
though, don't use sender
, e
parameters in guiform_load()
method, seems me omit those.
- the form shown
main()
method, passingapplication.run()
method. there shouldn't need callthis.show()
indowork
event handler. that's wrong place callshow()
anyway, since you're executing in wrong thread @ point. should remove call.
Comments
Post a Comment