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:

enter image description here

but instead i'm getting this:

enter image description here

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:

  1. there doesn't appear need oldmain() instance method. can make public static list<hashtable> oldmain() , call aldeloupdater.oldmain(). better, create separate class method, rather putting in otherwise main program class.
  2. 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 in runworkercompleted 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.

  1. the form shown main() method, passing application.run() method. there shouldn't need call this.show() in dowork event handler. that's wrong place call show() anyway, since you're executing in wrong thread @ point. should remove call.

Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -