Inserire una paginazione custom nel dontrollo datalist

domenica 24 dicembre 2006 - 20.28

Giovanni_3478 Profilo | Senior Member

Ciao

Vorrei aggiungere ad un datalist un paging
che mi permetta di spostarmi tra i record del database.

Devo usare proprio il datalist e non altri controlli
perchè ha una determinata caratteristica che fa al mio caso (la prorpietà repeatColumns).

Come posso muovermi?


freeteo Profilo | Guru

ciao,
purtroppo non c'e' il funzionamento "gia' fatto" come nella datagridview, lo so sarebbe comodo, ma diciamo che non è neanche difficle progettarselo.

Io farei cosi:

intanto, percaso usi datatable/dataset e dataAdapter per dare i dati al datalist? perche' il metodo "fill" del DataAdapter ha un overload che ti permette di farti restiture i dati paginati.
Se sei in questa situazione, ti basta costruirti un controllino semplice con 2 pulsanti di avanti indietro etc...(ovviamente puoi sofisticarlo quanto vuoi) che ti faccia da navigatore.
Sugli eventi di pressione "avanti/indietro" chiami l'overload passandogli pagina in piu o in meno...

Se putroppo non hai il dataadapter, devi fare la query paginata a mano, o se vuoi caricare i dati su un dataable e poi prendere la Rows di indice n, sempre usando il controllino di cui ti dicevo prima...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

freeteo Profilo | Guru

scusami, dimenticavo anche che potrebbe tornarti utile anche questo tip:
http://www.dotnethell.it/articles/DatalistPagineReadxml.aspx

dove fa la paginazione usando il readxml del dataset.
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

Ciao

Mi hai consigliato 3 metodi:
1) uno con l'overload del metodo fill;
2) uno facendo la query paginata a mano;
3) un altro utilizzando un'origine dati in formato XML, implementandone la paginazione.

1) con questo codice che credo sia "poco elegante"
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
ma che ottempera alle funzionalità che mi occorrono
ho creato un paging custom.

Ho usato il commandArgument di un cotrollo button
per salvare di volta in volta il numero del record in cui ci si trovava.
Potevo usare anche una querystring.
- Oppure cosa altro potevo usare?

vorrei ora creare un controllo di rendering personalizzato
creando una libreria di controlli web;
è la prima volta che creo una libreria di controlli web...
sul mio libro c'è un esempio base che dice come creare un controllo con le proprietà di default.. non è il massimo;
- conosci dei tutorial online sulla creazione di controlli di rendering personalizzato?
- conosci qualche libro che tratta il tema ?
- premesso che non voglio creare un template ascx,
è possibile inserire in un controllo di rendering personalizzato un insieme di controlli
(come i linkbutton, datalist, e sqldatasource) con l'aggiunta di altre funzionalità?
In pratica è possibile creare un controllo che rappresenti l'unione di più controlli messi assieme?

2) per quanto riguarda la query paginata a mano,
- dovrei usare questo codice?

-- Numero di pagina
DECLARE @PageNumber int;

-- Dimensione di pagina
DECLARE @PageSize int;

SET @PageNumber = [n];
SET @PageSize = [m];

-- Definisco la CTE con una colonna Row_Number.
-- La clausula TOP è parametrica, per cui è
-- possibile utilizzare anche parametri di input
-- al posto delle variabili definite sopra.

WITH PageRows([field_1], [field_2], [field_3], ...)
AS (

SELECT TOP(@PageNumber * @PageSize)
RowNumber = ROW_NUMBER() OVER (ORDER BY [field_1], ...),
[field_1], [field_2], [field_3], ...
FROM [table_name]
WHERE [where_conditions]

)

-- Sfrutto il Row_Number della CTE per recuperare
-- unicamente i record della pagina corrente.

SELECT [field_1], [field_2], [field_3], ...
FROM PageRows
WHERE RowNumber > ((@PageNumber - 1) * @PageSize);

Se sì
con sqlserver 2005 express,
con questo codice

DECLARE @PageNumber int; DECLARE @PageSize int;
SET @PageNumber = 1;
SET @PageSize = 5;
WITH PageRows(foto_percorsofile, descrizione_foto, commento_foto) AS
(SELECT TOP (@PageNumber * @PageSize) RowNumber = ROW_NUMBER() OVER (ORDER BY commento_foto), foto_percorsofile, descrizione_foto, commento_foto
FROM foto_squadra

mi restituisce un errore
"Il costrutto o l'istruzione SQL Dichiara cursore non è supportato".
- A cosa può essere dovuto?

freeteo Profilo | Guru

ciao,
ho contato almeno 7 domande in un post solo mi sembrano 1po tantine!
cmq provo a risponderti un po' con qualche dritta:

>Ho usato il commandArgument di un cotrollo button
>per salvare di volta in volta il numero del record in cui ci
>si trovava.
>Potevo usare anche una querystring.
>- Oppure cosa altro potevo usare?
ti ho allegato un progettino di esmpio, molto banale, che usa il viewestate.
quello che ho fatto io è webcontrol come "ascx", per velocita' e agilita' nella creazione, ti consiglio questa tipologia di controlli se vuoi essere rapido nello sviluppo, inquanto puoi combinare piu' oggetti grafici insieme e quindi renderti conto da subito dell'aspetto.



>- conosci dei tutorial online sulla creazione di controlli di
>rendering personalizzato?
>- conosci qualche libro che tratta il tema ?
sinceramente non so esattamente cosa consigliarti, perche' ce ne sono tanti.Quelli con cui io mi sono trovato bene sia dal punto di vista degli esempi pratici, che dalla professionalita', sono sicuramente quelli della Wrox, e ovviamente Microsoft Press (ottimi quelli del "mitiko" Dino Esposito)

>- premesso che non voglio creare un template ascx,
>è possibile inserire in un controllo di rendering personalizzato
>un insieme di controlli
>(come i linkbutton, datalist, e sqldatasource) con l'aggiunta
>di altre funzionalità?
Per fare un controllo di quel tipo ti basta seguire l'esempio, e "smazzarti" tutto il metodo Render,e costruire tutti vari tag html, quindi aperto chiuso, vari ed eventuali javascript etc...il tutto con stringa che poi verra' data in pasto a chi visualizza il tuo controllo (anche il designer di visual studio)
non so se proprio quel tipo di controlli, forse si ti basta dirgli di renderizzarsi nello stesso flusso.
Ovviamente in questa modalita' di incasini per gestire le posizioni, gli aspetti grafici etc...insomma un bel lavoraccio! anche se sicuramente puoi avere piu' controllo sull'html generato, fuori dubbio.
Pero' pesa il tempo speso per l'operazione, a volte non ne vale la pena.


>In pratica è possibile creare un controllo che rappresenti l'unione
>di più controlli messi assieme?
come ti dicevo, valuta se usare controlli ascx, e mixarli insieme graficamente, tanto cmq quello che rendi in entrambi i casi è lo stesso html, inquanto sono scritti nelle lib del framework



ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

Ciao

>ho contato almeno 7 domande in un post solo mi sembrano 1po tantine!
Hai ragione

Sto convertendo il codice in Vb
C'è una parte della sintassi che non riesco a convertire
Puoi dare un'occhiata al codice?
Imports System Imports System.Data Imports System.Configuration Imports System.Collections Imports System.Web Imports System.Web.Security Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Web.UI.WebControls.WebParts Imports System.Web.UI.HtmlControl Partial Class controlli_paging Inherits System.Web.UI.UserControl 'public event EventHandler ChangePage; come "si traduce" in VB? Private pagina As Integer Public Property NumeroPagina() Get Return pagina End Get Set(ByVal value) pagina = value End Set End Property Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) If ViewState("pagina") IsNot Nothing Then pagina = CInt(ViewState("pagina")) End If End Sub Protected Sub btnPrev_Click(ByVal sender As Object, ByVal e As EventArgs) pagina -= 1 ViewState("pagina") = pagina If ChangePage IsNot Nothing Then ChangePage(Me, Nothing) End If End Sub Protected Sub btnNext_Click(ByVal sender As Object, ByVal e As EventArgs) pagina += 1 ViewState("pagina") = pagina If (ChangePage IsNot Nothing) Then ChangePage(Me, Nothing) End If End Sub End Class

Ciao

freeteo Profilo | Guru

ciao,
la definizione dell'evento in vb.net ha una sintassi 1po differente, nel tuo caso è:

Private Event ChangePage As EventHandler

ps (consiglio):
se stai imparando il linguaggio .net, ti consiglio di prendere in seria considerazione che a conti fatti ti conviene sapere anche c#,tanto in .net il linguaggio fa poca differenza, se non solamente sintattica, quindi devi abituarti a capire e comprendere anche c# perche' ti troverai a farlo prima o poi di sicuro
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

Scusami ancora

Nel codice in corrispondenza di ChangePage
qual'è la sintassi

Partial Class controlli_paging Inherits System.Web.UI.UserControl Private Event ChangePage As EventHandler Private pagina As Integer Public Property NumeroPagina() Get Return pagina End Get Set(ByVal value) pagina = value End Set End Property Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) If ViewState("pagina") IsNot Nothing Then pagina = CInt(ViewState("pagina")) End If End Sub Protected Sub btnPrev_Click(ByVal sender As Object, ByVal e As EventArgs) pagina -= 1 ViewState("pagina") = pagina qui If RaiseEvent ChangePage() IsNot Nothing Then qui RaiseEvent ChangePage(Me, Nothing) End If End Sub Protected Sub btnNext_Click(ByVal sender As Object, ByVal e As EventArgs) pagina += 1 ViewState("pagina") = pagina qui If RaiseEvent ChangePage IsNot Nothing Then qui RaiseEvent ChangePage(Me, Nothing) End If End Sub End Class ' in c# protected void btnPrev_Click(object sender, EventArgs e) { pagina -= 1; ViewState["pagina"] = pagina; if(ChangePage != null) ChangePage(this, null); } protected void btnNext_Click(object sender, EventArgs e) { pagina += 1; ViewState["pagina"] = pagina; if (ChangePage != null) ChangePage(this, null); } }

freeteo Profilo | Guru

ciao,
scusami ma non programmo in vb.net da molto tempo oramai ed effettivamente si vede!
Infatti in vb puoi tranquillamente scatenare l'evento senza preoccuparti del fatto che qualcuno si sia "agganciato" a quell'evento, tanto non si scatenano eccezioni.
Quindi i poche parole il tuo codice fa bene cosi':
... pagina -= 1 ViewState("pagina") = pagina RaiseEvent ChangePage(Me, Nothing) End Sub
ovvero scatena l'evento, se poi nessuno lo gestisce non succede niente.
Nella pagina tu basta che fai doppio click sull'evento dalla finestra proprieta' (sezione eventi) del controllo, e scrivi il codice che ti serve per paginare...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

Funziona

Ora sto cercando di sofisticarlo un pò

Grazie Matteo senza il tuo aiuto e senza l'esempio che mi hai postato
non avrei fatto il paging custom per il datalist

freeteo Profilo | Guru

>Funziona
>Ora sto cercando di sofisticarlo un pò
ottimo!

>Grazie Matteo senza il tuo aiuto e senza l'esempio che mi hai
>postato
>non avrei fatto il paging custom per il datalist
di niente, mi fa piacere tu sia riuscito, scusami invece del fatto che non programmando in vb.net ho fatto qualche imprecisione nel codice...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5