Aggiorna datagrid su un diverso form

venerdì 11 giugno 2010 - 15.10

magicfly Profilo | Newbie

Salve,
questo è il mio problema:
ci sono 3 form ( form1, form2, form3)
Eseguendo l'applicazione passo per il form1 che lancia un thread per tutta la durata dell'applicazione e che viene eseguito con una certa cadenza poi viene chiuso form1 e aperto form2 dove è presente un datagrid.
Quando periodicamente parte il thread questo richiama il form3 che esegue delle operazioni e viene chiuso a questo punto avrei bisogno nel caso in cui sia aperto il form2 di aggiornare il datagrid.
E' possibile ???
ovvero come faccio a sapere trovandomi sul form1 quale form sono aperti ???
un grazie anticipato

freeteo Profilo | Guru

Ciao presumo tu sia in .net, visto che mi parli di Thread.
Se è così:

>ovvero come faccio a sapere trovandomi sul form1 quale form sono
>aperti ???
se hai un'applicazione che utilizza MdiForm, quindi con MdiChild è semplice sapere quali child sono aperte, usando la proprietà "MdiChildren" della MdiContainer. Quindi nella child puoi usare un codice di questo tipo:
(this.Parent as MdiParent).MdiChildren

se invece hai form singole e separate, puoi usare una Collection che ti tiene in memoria quello che viene aperto, magari puoi metterla per comodità nella classe Program che viene creata all'avvio dell'applicazione stessa:
... static class Program { static List<Form> forms = new List<Form>(); //--- la aggiungo una volta sola public static AggiungiFormAperta(Form frm) { bool trovata = false; foreach(Form f in forms) { if(f.Name == frm.Name) } if(!trovata) forms.Add(frm); } public static FormsAperte { get { return forms; } } ... }

e quando apri la form:
... Program.AggiungiFormAperta(this); ...
e se ti serve recuperarla puoi andare tramite la proprietà "Program.FormsAperte"...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

magicfly Profilo | Newbie

Ciao,
si sono in .net, e poichè sono form distinte vorrei usare la collection ora mi avrei bisogno di aggiornare una form della collection sapresti darmi qualche consiglio
grazie ancora

freeteo Profilo | Guru

Ciao,
devi recuperare la form e farci delle operazioni sui controlli etc..cose di questo genere?

Ti basta ciclare sulla collection FormsAperte del post precedente ed andare a trovare quella che ti interessa, trovata hai la possibilità di fare quello che ti serve.
Se sei in fmw 3.5 puoi usare linq che è comodissimo (altrimenti usa un foreach semplice con dentro l'if):
... Form trovata = Program.FormsAperte.Where(f => f.Name == "..nome.."); if(trovata != null) { //--- supponiamo che tu abbia una "FormClienti" dove //--- hai aggiunto i controlli a design etc... FormClienti form = trovata as FormClienti; form.GrigliaTUA... } ...

ps: nel post precedente mi son dimenticato di dirti che alla chiusura della form, chiaramente devi toglierla dalla collection magari invocando un metodo simile all'aggiungi, il quale cicla e se la trova la rimuove.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

magicfly Profilo | Newbie

Sono in fmw 2.0 ed aggiungo solo una form che ha me interessa aggiornare alla lista e sicuramente come tu mi hai ricordato dovrò comunque rimuoverla quando passo ad un'altra form e aggiungerla quando la riapro.

Per il controllo datagridview da aggiornare ho provato a recuperarlo in questo modo:
datagridview myDgv = (datagridview)myform.Controls["groupBox1"].Controls["dgvTask"];
ma tutte le modifiche non vengono caricate sul form perchè facente parte di un' altro processo

ho provato anche a chiudere il form e riaprirlo con il metodo show();

ho provato anche la seguente istruzione
List<Form> forms = new List<Form>();
forms = Program.FormsAperte;
Form myform = forms[0];
myform.refresh();

ma acora niente
se puoi darmi qualche altro aiuto
grazie

freeteo Profilo | Guru

>ma tutte le modifiche non vengono caricate sul form perchè facente parte di un' altro processo
in che senso, chiami qualche metodo, o cambi qualche proprietà e ti dà errore di Cross-Thread?

Se è quest'ultimo il caso, allora puoi intanto usare un codice comodo (ma non molto corretto), ossia settare:
Control.CheckForIllegalCrossThreadCalls = false;
Oppure usando un metodo più "pulito" ma più complesso, ossia invocando dal thread della form il codice che ti serve...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

magicfly Profilo | Newbie

Ci sono due processi che mi interessano uno è il processo della form che crea il datagrid_01, poi ho processo del thread che esegue una serie di istruzioni e prima di mettersi nuovamente in attesa prova ad accedere al datagrid_01 sollevando una eccezione di Tipo Cross-Thread

freeteo Profilo | Guru

Hai provato con il metodo "più veloce" che ti ho consigliato nel post precedente?

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5