asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 6046
ASPCode.it - Store

  > > Articoli

Paginare una Query con un DataList

Data di pubblicazione: 28/05/2002        Voto della community: 4,00 (Votanti: 2)

Tramite i DataGrid di ASP.net la paginazione di un risultato di una query risulta molto semplice e rapido, se utilizziamo invece un DataList la cosa non é piú cosí lineare; questo controllo infatti non permette di paginare automaticamente un RecordSet. Una soluzione potebbe essere selezionare l'intervallo di record da visualizzare tramite dei comandi SQL specifici ma la cosa non Ŕ possibile con tutti i database in circolazione. Vedremo ora come poter sorpassare questo limite:

<%@ Import Namespace="System.Data.Odbc" %>
<%@ Import Namespace="System.Data" %>

<script language="C#" runat="server">

//Estrae i record dal database
public void Seleziona_Record()
{
  //Apro la connessione al db, in questo caso   mySQL
  OdbcConnection ob = new OdbcConnection("Driver={MySQL};Database=db;UID=user;PWD=pass;");
  String sql = "select * from TABELLA";
  OdbcDataAdapter Com = new OdbcDataAdapter(sql,ob);
  DataSet ds = new DataSet();

  //Calcolo i record da estrarre e riempio   il dataset
  int startRecord = (int.Parse(Pagina.Value)-1)*int.Parse(Record_Max.Value);
  Com.Fill(ds, startRecord, int.Parse(Record_Max.Value), "Tabella");

  Grid.DataSource = ds.Tables[0];
  Grid.DataBind();

  //Conta i numero di record Totali
  OdbcCommand myCmd = new OdbcCommand("SELECT Count(*) FROM PAGINE", ob);
  ob.Open();
  Record_Tot.Value = myCmd.ExecuteScalar().ToString();
  ob.Close();

  //Controllo i Link
  if((int.Parse(Pagina.Value)-1)<=0){
    Prev.Enabled = false;
  }
  else{
    Prev.Enabled = true ;
  }
  if((int.Parse(Pagina.Value)*int.Parse(Record_Max.Value))>=int.Parse(Record_Tot.Value))
    Next.Enabled = false;
  else
    Next.Enabled = true ;
}

//Controlla che link ha sollevato l'evento e aumenta o diminuisce la pagina corrente
public void Paginazione(object sender, EventArgs e){
  if(((LinkButton)sender).ID=="Prev"){
    if((int.Parse(Pagina.Value)-1)>=0){
      Pagina.Value = (int.Parse(Pagina.Value)-1).ToString() ;
    }
  }
  else if(((LinkButton)sender).ID=="Next"){
    if((int.Parse(Pagina.Value)*int.Parse(Record_Max.Value))<int.Parse(Record_Tot.Value)){
      Pagina.Value = (int.Parse(Pagina.Value)+1).ToString() ;
    }
  }
  Seleziona_Record();
}

//Controlla se é la prima volta che la pagina viene visualizzata e in caso affermativo stampa
//la prima pagina

void Page_Load(Object sender, EventArgs e){
  if(!IsPostBack)
    Seleziona_Record();
}
</script>

<html>
<body>
<p align=center><b>Prova di Paginazione</b></p>
<center>
<form runat="server">
<input type="hidden" id="Record_Max" value="4" runat="server">
<input type="hidden" id="Pagina" value="1" runat="server">
<input type="hidden" id="Record_Tot" runat="server">
<asp:DataList id="Grid" runat="server" repeatlayout="table" DataKeyField="ID">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "ID") %>
-
<%#DataBinder.Eval(Container.DataItem,"PAGINA") %><br>
</ItemTemplate>
</ASP:DataList>
<asp:LinkButton id="Prev" Text="<< Prev" OnClick="Paginazione" runat="server" />
&nbsp;
<asp:LinkButton id="Next" Text="Next >>" OnClick="Paginazione" runat="server" />
</form>
</body>
</html>

Analizziamo ora ogni funzione della pagina, per prima cosa notiamo i 3 controlli HTML di tipo Hidden che useremo come variabili globali e che conterranno rispettivamente il numero di record visualizzati per pagina, la pagina corrente e i record totali.

Seleziona_Record() instaura la connessione al db che stiamo utilizzando, in questo caso é mySQL e la connessione avviene tramite ODBC, utilizzando OleDb non cambierá niente, gli oggetti usati sono praticamente identici, OdbcConnection sará OleDbConnection e cosí via. Dopo aver creato la connessione esegue la query di selezione che ci interessa ed riempie il DataSet che abbiamo creato con i record che compongono la pagina che dobbiamo visualizzare e abilita o meno i link che ci permettono di navigare tra le pagine controllando che ci troviamo in prima o ultima pagina.

Paginazione()
viene invocata dai due controlli web di tipo LinkButton si occupa di riconoscere l'oggetto che l'ha invocata e in base a quest'ultimo incrementa o diminuisce il valore della pagina corrente.

Page_Load() controlla solo che sia la prima volta che la pagina viene visualizzata e che non abbiamo giá clikkato su uno dei due LinkButton e in caso positivo stampa la prima pagina.




Utenti connessi: 6046