I use another method, written 100% by a genius (me! lol)
I love it, because it's simple and requires very little code...
In your page load:
- initialize session page counter..
- call the function that will create the links..
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Session("pageNum") = 1
End If
MakePageLinks()
End Sub
Here's mine: it counts total records from the datasource; I want 15 items per page here.
Protected Sub MakePageLinks()
Dim ds As New DataSet
Dim db As New DataBase
ds = db.query("SELECT Count(*) as numObs FROM Observations WHERE reviewed=1")
Dim numObs As Integer = ds.Tables(0).Rows(0).Item("numObs")
Dim numPages As Integer = numObs / 15
For i As Integer = 1 To numPages
Dim pageLink As New LinkButton
pageLink.Text = "[" + i.ToString + "]"
pageLink.CssClass = "normal"
pageLink.CommandArgument = i
pageLink.PostBackUrl = "#"
AddHandler pageLink.Click, AddressOf Me.PageLink_Click
pageLinks.controls.add(pageLink)
RadAjaxManager1.AjaxSettings.AddAjaxSetting(pageLink, TopObsList, LoadingPanel1)
Next
End Sub
(pageLinks is a tablecell, see below)
I also use the Telerik controls, so replace RadAjaxManager1.AjaxSettings.AddAjaxSetting(pageLink, TopObsList, LoadingPanel1)
with code to register a control as an async trigger to update panel containing the datalist...
Protected Sub PageLink_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Session("pageNum") = sender.commandargument
End Sub
Below your datalist, add this:
<br />
<asp:Table runat="server" ID="alignLinks" Width="700" HorizontalAlign="Center">
<asp:TableRow>
<asp:TableCell HorizontalAlign="Left">
<asp:LinkButton runat="server" ID="prevPageLink" CssClass="normal" Text="Previous page" PostBackUrl="#"></asp:LinkButton>
</asp:TableCell>
<asp:TableCell runat="server" ID="pageLinks">
</asp:TableCell>
<asp:TableCell HorizontalAlign="Right">
<asp:LinkButton runat="server" ID="nextPageLink" CssClass="normal" Text="Next page" PostBackUrl="#"></asp:LinkButton>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
Here you see I added next and prev links to, here's the code for them:
Protected Sub nextPageLink_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles nextPageLink.Click
Session("pageNum") += 1
End Sub
Protected Sub prevPageLink_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles prevPageLink.Click
If Session("pageNum") > 1 Then
Session("pageNum") -= 1
End If
End Sub
(they must also be ajaxified)
And finally, your datasource for the datalist should look something like this:
<asp:SqlDataSource runat="server" ID="acceptedDS"
ProviderName="System.Data.SqlClient"
OldValuesParameterFormatString="original_{0}"
ConnectionString="<%$ ConnectionStrings:yourConnectionString %>"
SelectCommand="declare @maxNum integer;SET @maxNum=(SELECT MAX(obs_num) FROM Observations); SELECT DISTINCT TOP 15 * FROM Observations WHERE reviewed=1 AND obs_num<=@maxNum-(15*(@pageNum-1)) ORDER BY obs_num DESC">
<SelectParameters>
<asp:SessionParameter Name="pageNum" Type="int32" SessionField="pageNum" />
</SelectParameters>
</asp:SqlDataSource>
This can easily be adpated to use querystring parameters instead of session.
Simple, efficient solution... If you know your way around ajax and sql...