Newsgroup: it.comp.lang.visual-basic
Titolo: Refresh() con VB.Net

Ho una form con sopra una label che si aggiorna durante l'elaborazione.
Purtroppo la visualizzazione del testo della label  non sempre è istantanea 
e per questo ad ogni variazione del testo,
ho inserito il label1.refresh().
 
Se la form contiene più di una label, devo necessariamente aggiungere il 
refresh per ogni label oppure c'è un sistema
trucchetto che mi permette di "refreshare" tutti gli oggetti presente sulla 
form?
 
Ciao
 
nero23 
 

 nero23
 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 

 e non il Refresh o il DoEvents di turno.
 
 
scusami, mi puoi dare una dritta su come impostare il progetto?
 
Grazie


a parte NomeForm/Me.Refresh() intendi?

 ha scritto:

Molto semplicemente potresti utilizzare un BackgroundWorker, di cui puoi 
gestire l'evento update per aggiornare la GUI :)
 
 

 
 
 
a parte NomeForm/Me.Refresh() intendi?
Si, qualcosa del genere.
 
Ciao


Quello che intendevo dire è: c'è qualche controindicazione particolare nel tuo caso tale per cui non puoi usare semplicemente quello?
 
Perchè fa esattamente quello che ti serve (tra l'altro a differenza di VB6 non causa flickering) e a patto di non abusarne chiamandola troppe volte in un ciclo "stretto", non rallenta troppo l'esecuzione.
 
Oltre a esecuzioni asincrone come detto sopra (dove però il comportamento della faccenda cambia al di là del refresh, e va preso in considerazione) trucchetti vari te ne puoi inventare tanti... alcune idee su due piedi
 
Uno semplice, per esempio, è questo:
Public Class LabelAutoRefresh
   Inherits System.Windows.Forms.Label
 
   Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
      MyBase.OnTextChanged(e)
      Me.Refresh()
   End Sub
 
End Class
 
usandolo questo controllo al posto delle tue label "contatore", ti basta impostare .text e sei a posto.
Occhio perchè essendo totalmente implicito in ogni cambio di testo, si rischia facilmente di aggiungere un overhead considerevole. Da usare con parsimonia.
 
Uno leggermente più elaborato, con cui hai più controllo sulle performance:
Public Class AutoRefresher
   Inherits System.Collections.Generic.List(Of Control)
 
   Private refreshInterval As Integer
   Private callCount As Integer
 
   Sub New(ByVal interval As Integer, ByVal ParamArray controls() As Control)
      refreshInterval = interval
      Me.AddRange(controls)
   End Sub
 
   Sub Refresh()
      callCount += 1
      If callCount Mod refreshInterval = 0 Then
         For Each c As Control In Me
            c.Refresh()
         Next
      End If
   End Sub
 
   Sub Reset()
      callCount = 0
   End Sub
End Class
 
Lo inizializzi una tantum con
 
Dim autoRef As New AutoRefresher(200, Label1, Label2, ecc., ecc.)
 
e poi chiami a ogni iterazione con autoRef.refresh(); il refresh reale dei controlli non viene eseguito sempre, ma solo a intervalli specificati, cosa che limita molto l'overhead... è facile adattarlo per ragionare in termini di tempo trascorso o percentuale oltre che numero di iterazioni.
 

 
 
Quello che intendevo dire �: c'� qualche controindicazione particolare nel 
tuo caso tale per cui non puoi usare semplicemente quello?
 
No. Solo che non so da dove iniziare :(
 
 
 
grazie
 
ciao
 
 

 No. Solo che non so da dove iniziare :(
 
Mi sa che non ho capito... il metodo Refresh è già disponibile nell'oggetto Form, se ti è sufficente solo quello, non devi "iniziare" niente; lo chiami e voilà: refresh di tutti i controlli in un colpo solo.

 
 
 
Mi sa che non ho capito... il metodo Refresh è già disponibile nell'oggetto 
Form, se ti è sufficente solo quello, non devi "iniziare" niente; lo chiami 
e voilà: refresh di tutti i controlli in un colpo solo.
 
 
 
 
 
Proverò con Form1.refresh()
 
grazie
 
ciao