264 messaggi dal 06 settembre 2002
Temporizzando l'aggiornamento del controllo DataGrid ogni 100ms non riesco più ad usare ne le berre di scroll, ne tantomeno a selezioanre le righe ... come faccio ad aggiornare i dati in tabella senza ricaricarla da capo ... ????


un po' del mio codice:
 
    ' In un controllo buttom imposto il timer. 
    myDispatcherTimer.Interval = New TimeSpan(0, 0, 0, 0, 100) ' 100 Milliseconds 
        AddHandler myDispatcherTimer.Tick, AddressOf LoadMissioni 
        myDispatcherTimer.Start() 

 
    ' Ogni 100ms viene richiamata la funzione. 
    Private Sub LoadMissioni() 
        Dim client As sr_001.Iservice_001Client = New sr_001.Iservice_001Client() 
        AddHandler client.getMissioniCompleted, AddressOf client_getMissioniComplited 
        client.getMissioniAsync() 
         
    End Sub 


 
 
     ' Completed del metodo asincrono di caricamento. 
    Private Sub client_getMissioniComplited(ByVal sender As Object, ByVal e As sr_001.getMissioniCompletedEventArgs) 
 
 
        dgMissioni.ItemsSource = e.Result 
 
 
 
 
    End Sub 


>*************************************************<
>** se fossi mondo monderei lo mondo **<
>*************************************************<
131 messaggi dal 12 febbraio 2001
Ciao

anche io ho un datagrid che si aggiorna continuamente, ed ho risolto in questo modo:

assumendo che la chiamata al servizio ti ritorna una OsvervableCollection<Missioni>, Missioni deve implementare INotifyPropertyChanged. Creati una variabile privata a livello di classe di nome _missioni di tipo OsvervableCollection<Missioni> e nell'evento client_getMissioniComplited fai pressappoco cosi (VB non garantito  ):

Dim _missioni as OsvervableCollection<Missioni>

Private Sub client_getMissioniComplited(ByVal sender As Object, ByVal e As sr_001.getMissioniCompletedEventArgs)

if _missioni=nothing then
_missioni= e.Result
dgMissioni.ItemsSource=_missioni
else
ComparaMissioni(e.result)
dgMissioni.Refresh()
end if

End Sub

Il metodo ComparaMissioni fa una comparazione delle due collection e aggiorna _missioni rendendolo uguale a e.result. Nel mio caso i valori che cambiano sono pochi quindi la comparazione è veloce. Il datagrid si aggiorna senza cambiare righe selezionate o posizione di scorrimento.

Edika
264 messaggi dal 06 settembre 2002
Grazie, ho due domando ora .. :)
1. per la comaprazione delle collection esiste un metodo in particolare o è necessario farlo 'a mano' ...
2. il metodo datagrid refresh non esiste ... magari c'è ne uno alternativo che mi sfugge ...

Grazie ancora

>*************************************************<
>** se fossi mondo monderei lo mondo **<
>*************************************************<
264 messaggi dal 06 settembre 2002
ma usi il datagrid di silverlight?
quando faccio l'associazione datagrid.ItemSource = e.result è come se mi ricreasse tutto il componente ...

>*************************************************<
>** se fossi mondo monderei lo mondo **<
>*************************************************<
131 messaggi dal 12 febbraio 2001
Ciao

scusami mi sono accorto che in questa applicazione uso il datagrid di devexpress  , che comunque è free, ed è molto simile a quello di silverlight con delle funzinalita in piu, lo trovi qui se vuoi provarlo: http://www.devexpress.com/Products/NET/Controls/Silverlight/Grid/.
In ogni caso quando aggiorni la variabile _missioni con cui hai fatto il binding, se Missioni implementa INotifyPropertyChanged, il datagrid di silverlight si aggiorna automaticamente perche supporta questa interfaccia.
datagrid.ItemSource lo devi assegnare solo la prima volta, poi devi sempre aggiornare _missioni, altrimenti viene rieffettuato il DataBind della griglia, perdendo scroll, righe selzionate ecc. ecc.

Per la comparazione io la faccio sulle proprieta che mi interessano e la faccio 'a mano'.
Se nel tuo caso è troppo laborioso mi vengono in mente due modi:
1) _missioni.SequenceEqual(e.result) ed eseguire l'override di Equals e GetHashCode nella classe Missioni, ed implementare il tuo confronto personalizzato
2)_missioni.SequenceEqual(e.result,missioniComparer), dove missioniComparer è una classe che implementa IEqualityComparer<Missioni> e che esegue la tua comparazione personalizzata.

Ricorda comunque che la comprazione ti serve solo a verificare che le due collection siano uguali. Nel caso siano diverse devi comunque aggiornare quella locale e renderla uguale a quella nuova.


Edika

Modificato da edika il 11 giugno 2009 16.12 -
Modificato da edika il 11 giugno 2009 16.19 -
264 messaggi dal 06 settembre 2002
Il componente lo provo subito ...
Il fatto è che non riesco a capire se la mia classe missioni implementa INotifyPropertyChanged, è una classe creata da un elemento LinqToSQL.
Se ho capito giusto una volta fatta l'associazione datagrid.ItemSource = _missioni (OsvervableCollection) è sufficiente cambiare in dati in _missioni (_missioni = e.Result) per vedere il datagrid aggiornarsi senza richiamare di nuovo datagrid.ItemSource = _missioni ...
è corretto?

>*************************************************<
>** se fossi mondo monderei lo mondo **<
>*************************************************<
131 messaggi dal 12 febbraio 2001
Se fai _missioni=e.result è come se tu facessi datagrid.ItemSource =e.result e viene rieffettuato il binding. Rileggi la mia risposta precedente l'ho modficata emntre stavi scrivendo, forse ora è piu chiara.

Controlla la tua classe creata da Linq e verifica se implementa INotifyPropertyChanged, altrimeti implementala tu è molto semplice, creati una classe base tipo questa:

[DataContract]
public abstract class EntityBase : INotifyPropertyChanged
{
protected void PropertyChangedHandler(EntityBase sender,
string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(sender, new PropertyChangedEventArgs(
propertyName));
}
public virtual event PropertyChangedEventHandler PropertyChanged;

}

e fai si che tutte le tue classi LinqToSql derivino da questa

Edika
264 messaggi dal 06 settembre 2002
mmm ... forse ho capito ... grazie!!!!!!!!!
Modificato da ugo il 11 giugno 2009 19.09 -

>*************************************************<
>** se fossi mondo monderei lo mondo **<
>*************************************************<

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.