2010-05-17 6 views
5

Ho un ListView ASP.NET impaginato. I dati mostrati sono filtrati, che possono essere controllati da un modulo. Quando il modulo filtro cambia, creo una nuova query ed eseguo un DataBind.Come forzare ListView a mostrare la prima pagina al livello di programmazione

Il problema tuttavia, quando vado alla pagina successiva, e impostare un filtro, il ListView mostra "Nessun dato è stato restituito". Non è strano, perché dopo l'applicazione del filtro, c'è solo una pagina di dati.

Quindi, quello che voglio fare è resettare il cercapersone. È una soluzione corretta al problema? E come lo faccio?

+0

Usi QueryStringField in Pager o quello di ViewState? – eugeneK

+0

No. L'unica cosa non standard che sto facendo è che ricostruisco la query di Linq con ogni postback ... – doekman

risposta

9

Io uso questo hack nel mio gestore del carico. Non ripristinerà il cercapersone se il numero di elementi del risultato è lo stesso, ma l'indice di pagina sarà ancora valido, quindi per ora posso conviverci.

+0

Funziona per me. Assicurati di impostarlo prima che la vista elenco sia vincolata ai dati. – rdans

4

Se sai come farlo, è semplice. Ho aggiunto il codice qui sotto ai miei onchange -Eventi di mio filtro:

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager; 
if (pager != null) 
{ 
    pager.SetPageProperties(0, pager.PageSize, true); 
} 
1

Una delle soluzioni precedenti è corretta poiché entrambe chiamano lo stesso metodo. Penso solo che dovrebbe essere sottolineato che dovresti chiamare yourPagerElement.SetPageProperties(...) ovunque tu voglia aggiornare la tua origine dati (cioè una lista o un array, ecc.). Ad esempio, dopo aver applicato alcuni filtri o qualcosa che modifica notevolmente le dimensioni dell'elenco.

0

Si possono avere problemi se il vostro ListView è delimitata automaticamente (cioè ObjectDataSource) gestore di eventi

carico non funziona, perché non avete ancora il nuovo valore DataPager.TotalRowPage, ma è possibile gestire Page_PreRenderComplete, come this:

protected void Page_PreRenderComplete(object sender, EventArgs e) 
    { 
     // PreRenderComplete occurs just after databindings page events 
     // And saves to viewstate 

     // Trick on search to avoid "No data" on results when old page is greater than actual row count     
     if (DataPager1.StartRowIndex > DataPager1.TotalRowCount) 
      DataPager1.SetPageProperties(0, DataPager1.MaximumRows, true); 
    } 

Lascia sempre ListView in una pagina con dati. Se la pagina è maggiore di TotalRow, passa alla prima pagina.

Note: sto usando paginazione efective, e tornando solo i dati da visualizzare, quindi ho bisogno di rilegare de origine dati (ultimo parametro (true))

Contro: Doppio databind se StartRowIndex è maggiore di TotalRowCount .