Oppure

Loading
21/08/14 10:07
NetProgrammer
Buongiorno, Vi scrivo perchè non riesco a risolvere il seguente problema.
Sto scrivendo un'applicazione in C# che fa uso di threads. La struttura è la seguente:
Ho un Windows Form con un datagrid vuoto, dal thread del form avvio un thread secondario(uno o più;) che ha il compito di aggiornare il datagrid.
Da quello che ho studiato ho capito che devo creare un delegato per permettere al thread di agire sul controllo del main thread in maniera sicura.
Ecco quello che ho fatto io:
Codice del delegato nel widows form
public delegate void updateGridHandler(DataTable dt);
        public void updateGrid(DataTable dt)
        {
            if (this.dataGridView1.InvokeRequired)
                this.dataGridView1.Invoke(new updateGridHandler(updateGrid), dt);
            else
                this.dataGridView1.DataSource = dt;
        }

Il codice del thread risiede in una classe separata(GlobalItems) che richiamo in questa maniera dal form principale alla pressione di un bottone:
                GlobalItems.t = new Thread(new ThreadStart(GlobalItems.tester));
                GlobalItems.t.Start();

Ora dal thread quando devo modificare il datagrid lo faccio in questa maniera:
if (...)
                        {
                            MainForm mf = new MainForm();
                            mf.updateGrid(dt); //dt=datatable con i dati aggiunti dal thread
                        }

Debuggando l'applicazione ho notato che InvokeRequired è sempre false e quindi il datagrid non viene aggiornato.
Non riesco a capire dove sbaglio.
In attesa di una Vostra gentile risposta,
distinti saluti.
Ultima modifica effettuata da NetProgrammer 21/08/14 10:10
aaa
12/09/14 10:06
vankraster
Io avrei risolto in un'altra maniera (Codice C#):
Nel Form1 fai:
   
public void updateGrid(){
this.dataGridView1.DataSource = dt;
this.dataGridView1.DataBind();
}


Quando devi modificare la grid dal thread fai:

 public delegate void InvokeDelegate(); 

 this.Form1.BeginInvoke(new InvokeDelegate(updateGrid));


In precedenza al thread gli devi passare il Form1 come parametro, quindi alla classe aggiungi una proprietà di tipo Form e prima di lanciare il thread fai classe.mf= Form1; Non va bene come fai tu "MainForm mf = new MainForm();" la Form1 dev'essere la stessa che tu hai creato in precedenza.
Adesso ti rimane passare il paramentro dt alla Form1, ma dovrebbe essere una cavolata
Ultima modifica effettuata da vankraster 12/09/14 10:08
aaa