Aggiornare progress bar

giovedì 27 marzo 2008 - 18.29

denis.basei Profilo | Senior Member

L'uso di una progressbar da un form è una cosa semplice. Trovo difficoltà ad aggiornare la progressbar presente su un form da un metodo di una classe, richiamato dalla form stessa. All'interno di questo metodo avviene un ciclo di lettura e man mano che questo viene processato dovrei aggiornare la progressbar del form. Ho avuto la tentazione di usare i delegate ma la mia inesperienza in materia mi ha bloccato subito. Qualcuno mi sa dare un suggerimento?


Grazie
Denis B. - www.baseiengineering.com

freeteo Profilo | Guru

ciao,
probailmente ti bastera' impostare la proprieta' " Control.CheckForIllegalCrossThreadCalls=false" e fare l'aggiornamento normale dentro al Thread che lanci.
Quindi puoi usare un codice tipo questo:

Control.CheckForIllegalCrossThreadCalls = false; Thread t = new Thread( delegate() { for (int i = 0; i < 100; i++) { progressBar1.Value++; Thread.Sleep(100); } MessageBox.Show("Finito"); }); t.Priority = ThreadPriority.Lowest; t.Start();

come vedi viene lanciato un thread, e lasciato aspettare (per simulare la pesantezza) ma con l'opzione CheckForIllegalCrossThreadCalls puoi evitare di passare tramite delegate...diciamo che te lo fa lui sotto

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

totti240282 Profilo | Guru

Sinceramente io lo eviterei come la peste quel comando,e come dice mamma microsoft userei i Delegate.
C'è solo un capitano !!!!!!

freeteo Profilo | Guru

>Sinceramente io lo eviterei come la peste quel comando,e come
>dice mamma microsoft userei i Delegate.
indubbiamente è meglio usare i delegate, ma dato che denis nn era agile con questi mi sembrava la soluzione piu' comoda, visto anche la situazione limitata ad un solo processo.
Ma scusa, sai indicarmi dove mamma ms sconsiglia di usare quella proprieta'?


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Spartacus Profilo | Newbie

beh potresti usare direttamente gli eventi basati sul delegato preimpostato EventHandler.
Ogni volta che devi incrementare di un'unità la progress bar lanci il tuo evento con la primitiva invoke.
Ovviamente la tua Form deve essersi registrata a que2ll'evento.

Veloce esempio:

public event EventHandler IncrementaProgressBar;

public void Tuo metodo()
{
/*ciclo di lavoro fase 1 */
Invoke(IncrementaProgressBar);
/*ciclo di lavoro fase 2 */
}

void Form_IncrementaProgressBar(object sender, EventArgs e)
{
Progressbar1.value ++;
ProgressBar1.refresh();
}

io ho usato un sistema simile per notificare inizio, durata e fine di una comunicazione su seriale e funziona.

Cristian
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