2013-01-15 12 views
6

Aggiunta a un post di 4 mesi fa, che purtroppo non ha ricevuto risposta.Richieste DataGrid in caso di modifica del multiselezione con virtualizzazione dei dati

Sono praticamente in piedi davanti allo stesso problema quando si utilizza la multiselezione in un datagrid con maiuscole.

Quando ci si trova da qualche parte nel mezzo di una lista enorme (diciamo che sono 1.000.000 elementi nella griglia, tutti i dati virtualizzati) e dovevo selezionare da 500.000 a 500.050 utilizzando MAIUSC + clic del mouse, la griglia chiama "GetEnumerator() "metodo della mia lista virtuale (implementazione simile a quella di Vincent e Paul). Quello che ho fatto fino ad ora era solo un SelectMany nelle pagine in cache. Purtroppo però le righe non sono state selezionate correttamente (mentre ctrl + clic del mouse fa il lavoro!).

Quindi quello che ho trovato è che il DataGrid si aspetta effettivamente tutti gli articoli dall'indice 0 all'ultimo della selezione. Questo, ovviamente, non è l'ideale per un elenco di articoli da 1m in quanto ciò comporterebbe richieste per ogni articolo da 0 a (nel mio esempio) 500.050 e quindi il caricamento di tutto il database del modulo.

Così le mie domande sarebbero le stesse di quelle di Daniele in th elinked postato sopra:

  • Perché la richiesta DataGrid articoli più volte (elementi selezionati sono invitati ~ 6-7 volte di fila per nessuna ragione apparente)?

  • C'è un modo per dire al DataGrid di non usare l'Enumeratore e solo prendere gli elementi selezionati e non scorrere da 0 in poi?

La ringrazio molto, sperando di avere più fortuna a ottenere almeno stimolante risposte, come non c'è molto da trovare per quanto riguarda la virtualizzazione dei dati.

risposta

3

Ho trovato una soluzione a questo problema (almeno posso dire che funziona per me).

Quello che ho praticamente fatto è stato ingannare il VirtualList in quanto tale che faccio il seguente codice:

for (int i = 0; i < Count; i++) 
{ 
    int pageIndex = i/PageSize; 
    int pageOffset = i%PageSize; 
    IList<TItem> page; 
    if (pages.TryGetValue(pageIndex, out page)) 
    { 
    yield return page[pageOffset]; 
    } 
    yield return default(TItem); 
} 

In questo modo sarò sempre ottenere gli elementi che sono veramente nella lista, ma niente di tornare quando è parte della virtualizzazione.

Ovviamente questo può causare altri problemi, ma questo è il più vicino che ho ricevuto in merito.

Problemi correlati