Seguendo le indicazioni di questo sito http://aspnet.4guysfromrolla.com/articles/021308-1.aspx ho paginato un listview usando un datapager esterno, customizzando il Templatepagerfield.
Il paginatore effettivamente appare come voglio sul page load ma non funzionano i link alle pagine del listview e addirittura il datapager scompare quando seleziono una pagina diversa dalla attiva.
Questo è il datapager (uso una tabella perchè sto cercando di usare lo stesso stile usato per altri controlli di tipo gridview in giro per il mio sito):
codice:
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3">
<Fields>
<asp:TemplatePagerField>
<PagerTemplate>
<div id="divv" runat="server" class="pagination-ys" >
<table runat="server" id="tabpager">
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>
</PagerTemplate>
</asp:TemplatePagerField>
</Fields>
</asp:DataPager>
E questo è il codice lato server con il quale inserisco le pagine e gestisco il click per il cambiopagina:
codice:
Protected Sub Listview1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.DataBound
Dim currentPage As Integer = (DataPager1.StartRowIndex / DataPager1.PageSize) + 1
Dim totalPages As Integer = DataPager1.TotalRowCount / DataPager1.PageSize
Dim lbl As Label, lnk As LinkButton
Dim ph As HtmlGenericControl = DataPager1.Controls(0).FindControl("divv")
Dim tb As HtmlTable = ph.FindControl("tabpager")
For i As Integer = 1 To totalPages
Dim td = New HtmlTableCell
If i = currentPage Then
'creo una label dentro alla cella
lbl = New Label
lbl.Text = i
lbl.CssClass = "pagination-ys"
td.Controls.Add(lbl)
Else
'creo un link dentro alla cella
lnk = New LinkButton
lnk.Attributes.Add("pag", i)
lnk.CssClass = "pagination-ys"
lnk.Text = i
'gli attacco il codice da eseguire sul click
AddHandler lnk.Click, AddressOf PageJump
td.Controls.Add(lnk)
End If
tb.Rows(0).Cells.Add(td)
Next
End Sub
Protected Sub PageJump(ByVal sender As Object, ByVal e As System.EventArgs)
Dim lnk As LinkButton = CType(sender, LinkButton)
Dim pageNo As Integer = Convert.ToInt32(lnk.Attributes.Item("pag"))
Dim startRowIndex As Integer = (pageNo - 1) * DataPager1.PageSize
DataPager1.SetPageProperties(startRowIndex, DataPager1.PageSize, True)
End Sub
Noto che il codice che viene generato sulla pagina html è un po' diverso da come dovrebbe venire, in particolare nella funzione JS chiamata dal link manca il secondo parametro con l'indicazione della pagina!:
codice:
'codice del paginatore di un gridview che funziona
<div class="pagination-ys">
<table>
<tbody>
<tr>
<td>
<span>1</span>
</td>
<td>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$GV_opeaperti','Page$2')">2</a>
</td>
</tr>
</tbody>
</table>
</div>
'codice generato per il mio paginatore che non funziona
<div id="ContentPlaceHolder1_DataPager1_ctl00_divv" class="pagination-ys">
<table id="ContentPlaceHolder1_DataPager1_ctl00_tabpager">
<tbody>
<tr>
<td>
<span>1</span>
</td>
<td>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$DataPager1$ctl00$ctl04','')" pag="2">2</a>
</td>
</tr>
</tbody>
</table>
</div>
Cosa sbaglio o cosa devo eventualmente modificare/aggiungere?