Domanda

Ho un paging ASP.NET ListView. I dati riportati si filtra, che possono essere controllati da un modulo. Quando la forma del filtro cambiamenti, ho creare una nuova query, ed eseguire un DataBind.

Il problema però, quando vado alla pagina successiva, e impostare un filtro, gli spettacoli ListView "Nessun dato è stato restituito". Questo non è strano, perché dopo l'applicazione del filtro, c'è solo una pagina di dati.

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

È stato utile?

Soluzione

Io uso questo hack nel mio gestore del carico. Non sarà azzerato il cercapersone se il numero di elementi risultato è lo stesso, ma l'indice pagina sarà ancora valida in modo da poter vivere con questo per ora.

if (IsPostBack)
{
    DataPager pgr = MyListView.FindControl("MyPager") as DataPager;
    if (pgr != null && MyListView.Items.Count != pgr.TotalRowCount)
    {
        pgr.SetPageProperties(0, pgr.MaximumRows, false);
    }
}

Altri suggerimenti

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

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

Uno di quanto sopra soluzioni sono corretti in quanto entrambi chiamata lo stesso metodo. Penso solo che sia opportuno precisare che si dovrebbe chiamare yourPagerElement.SetPageProperties(...) dove vuoi la tua origine dati (ad esempio un elenco o una matrice, ecc) per essere aggiornato. Ad esempio, dopo l'applicazione di un po 'di filtrazione o qualcosa che cambia notevolmente le dimensioni dell'elenco.

Si può avere problemi se il vostro ListView è delimitata automaticamente (cioè ObjectDataSource)

gestore di eventi Load non funziona, perché non avete ancora il nuovo valore DataPager.TotalRowPage, ma è in grado di gestire Page_PreRenderComplete, in questo modo:

    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);
    }

Questo lascia sempre ListView in una pagina con i dati. Se la pagina è maggiore di TotalRow, passare 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top