Domanda

Ho un datatable che restituisce circa 30.000 record. Sto visualizzando questi record in un ASP: controllo GridView. Ho un controllo a discesa in cui voglio che l'utente sia in grado di selezionare il numero di record da visualizzare in GridView. L'impostazione predefinita dovrebbe essere Tutto, ma potrebbe anche avere valori come 20, 50, 100 per esempio. Non sono del tutto sicuro di come farlo.

Cosa succede se non ho il paging attivato. PageSize funzionerà ancora?

Ho programmato GridView.PageSize = 1 e ho ancora restituito tutti i record.

È stato utile?

Soluzione

Se vuoi che PageSize funzioni devi impostare AllowPaging di GridView su true. Ovviamente devi creare il metodo per gestire l'evento PageIndexChanging.

In questo modo:

protected void myGvw_OnPageIndexChanging(object sender, GridViewPageEventArgs e) 
{
     myGvw.PageIndex = e.NewPageIndex;
     // then recall the method that bind myGvw
}

DropDown potrebbe avere la proprietà AutoPostBack impostata su true e sul suo OnSelectedIndexChanged è necessario impostare

myGvw.PageSize = Convert.ToInt32(myDropDown.SelectedValue)

Altri suggerimenti

Utilizza la proprietà PageSize di gridview. Link .

È possibile aggiungere il valore dell'elenco a discesa (20, 50, 100) alla query in modo da selezionare solo i record principali (20, 50, 100).

Utilizzerai anche il paging?

Il paging deve essere sempre gestito il prima possibile nella selezione dei dati. Non vuoi recuperare 30.000 record dal DB al server delle app per mostrarne solo 50.

Qualcosa del tipo: (per selezionare pagina 3, 50 per pagina)

select top 50 from x where pk not in (select top 100 pk from x)

Che si traduce in:

CREATE PROCEDURE sspGetItems (@pageSize int, @pageNum int)
AS
SELECT TOP @pageSize 
FROM x
WHERE pk NOT IN 
(
 SELECT TOP (@pageNum - 1) * @pageSize pk FROM x
)

Ovviamente sarà necessario prestare maggiore attenzione all'ordinamento ecc.

Ecco cosa farei. Innanzitutto aggiungerei una colonna al DataTable che fungerebbe da contatore se non è già presente. Quindi, associ GridView a DataView. Ecco un po 'di codice per dimostrare di cosa sto parlando:

            //add column with counter
            table.Columns.Add("counter", typeof(int));
            for (int i = 0; i < table.Rows.Count; i++)
            {
                table.Rows[i]["counter"] = i+1;
            }

Quindi, ottieni la vista predefinita dalla DataTable e imposta il RowFilter:

            DataView view = table.DefaultView;
            view.RowFilter = "counter <= 100"; //or whatever number the user selected

Infine, basta collegare direttamente GridView a DataView.

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