Hola, es una paginación que hice y me gustaría que la prueben si alguien tiene un poco de tiempo para que me de su opinión al respecto. Le encontré hasta ahora unos cuantos errores. Cuando se muestra un número inferior de registros al que debe contener cada página; y supuestamente en el código lo que trato de hacer es que la primera vez que el usuario entré a la página se cree la estructura del datatable, pero dije supuestamente porque no funciona así, sino que cada vez que carga la página se crea un nuevo Datatable, por más que le haya puesto If not isPostBack. Lo demás funciona correctamente según lo he probado.
Acá está el código, no les pido que lo analicen profundamente, pero si pueden darle al menos una leida rápidamente para ver más o menos como funciona y me den sus comentarios, estaría muy agradecido, ya que estoy incursionando en esto de la programación, y sobre todo en Asp.Net.
Acá está el código:
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.OleDb"%>
<script runat="server">
Sub Page_Load(A As Object, E As EventArgs)
Dim strConn As string
Dim pag_Table As DataTable 'Esta es la tabla que se muestra al usuario
Dim Row As DataRow
Dim newRow As DataRow
Dim i As Byte
Dim b As Byte
Dim totalPages As Byte
Dim totalRecords As Byte
Dim RecordsPerPage As Byte = 6
Dim actualPage As Byte = Request.QueryString("page")
Dim StartAt As Byte = (actualPage - 1) * RecordsPerPage
Dim Y As Byte = StartAt
Dim var As Byte = StartAt
Dim Pages As String
Dim DS As New DataSet()
If Not isPostBack then
strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Inetpub\wwwroot\SiteData.mdb;"
Dim oConn As New OleDbConnection(strConn)
Dim ap As New OleDbDataAdapter("SELECT Id, Nombre, Imagen, Precio FROM Productos WHERE IdNegocio = 2", oConn )
ap.Fill(DS,"Products")
totalRecords = DS.Tables("Products").Rows.Count
totalPages = totalRecords/RecordsPerPage
if totalRecords Mod RecordsPerPage > 0 then
totalPages += 1
end if
pag_Table = New DataTable("PagingTable")
pag_Table.Columns.Add("Id", GetType(Integer))
pag_Table.Columns.Add("Nombre", GetType(String))
pag_Table.Columns.Add("Imagen", GetType(String))
pag_Table.Columns.Add("Precio", GetType(Decimal))
For i=0 to RecordsPerPage - 1
newRow = pag_Table.NewRow
newRow("Id") = 0
newRow("Nombre") = ""
newRow("Imagen") = ""
newRow("Precio") = 0
pag_Table.Rows.Add(newRow)
Next
End If
For B=0 to RecordsPerPage - 1
Row = pag_Table.Rows(B)
Row("Id") = DS.Tables("Products").Rows(Y).Item(0)
Row("Nombre") = DS.Tables("Products").Rows(Y).Item(1)
Row("Imagen") = DS.Tables("Products").Rows(Y).Item(2)
Row("Precio") = DS.Tables("Products").Rows(Y).Item(3)
For Y=var to var
Next
var +=1
If Y > TotalRecords - 1 then
Exit for
end if
Next
For i=1 to totalPages
Pages = Pages & "<a href=paging.aspx?page=" & i & ">" & i & "</a> "
Next
lnk_Next.text = "<a href=paging.aspx?page=" & actualPage + 1 & ">Siguiente</a>"
lnk_Previous.text = "<a href=paging.aspx?page=" & actualPage - 1 & ">Anterior</a>"
lnk_Pages.text = Pages
if ActualPage > 1 then
lnk_Previous.Visible = true
End if
if ActualPage < TotalPages
lnk_Next.Visible = true
End if
DataList1.DataSource = pag_Table.DefaultView
DataList1.DataBind()
End sub
</script>
<html>
<head>
<style type="text/css">
A.producto:visited {font-family:Verdana, Arial, Helvetica, Sans-serif;font-weight:light;color:#0066CC;font-size:10px;text-decoration:nunderline}
A.producto:hover {font-family:Verdana, Arial, Helvetica, Sans-serif;font-weight:light;color:darkorange;font-size:10px;text-decoration:underline}
A.producto:link {font-family:Verdana, ARial, Helvetica, Sans-serif;font-weight:light;color:#0066CC;font-size:10px;text-decoration:underline}
A.producto:active {font-family:Verdana, Arial, Helvetica, Sans-serif;font-weight:light;color:#0066CC;font-size:10px;text-decoration:underline}
.celda_descripcion {color:balck;font-family:Arial, Helvetica, Sans-serif;font-size:10px;font-weight:light;padding-top:4px}
.celda_imagen {padding-bottom:14px}
</style>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form runat="server">
<asp:datalist Id="Datalist1" runat="server" RepeatColumns="3" CellPadding="0" CellSpacing="0" HorizontalAlign="Center">
<itemTemplate>
<table width="200">
<tr><td align="center" width="200" height="85"><img src='<%# Container.DataItem("Imagen")%>' height="80" width="80"></td></tr>
<tr><td align="center" height="20"><a href="Details.aspx?id=<%# Container.DataItem("Id")%>" class="producto"><%# Container.DataItem("Nombre")%></a></td></tr>
<tr><td align="center" height="20" class="celda_descripcion">$ <%# Container.DataItem("Precio")%></td></tr>
<tr><td align="center" height="25"><a href="Add.aspx?id=<%# Container.DataItem("Id")%>&Qty=1"><img src="Imágenes/comprar_button.jpg" border="0"></a></td></tr>
</table><br><br>
</itemTemplate>
</asp:datalist>
<asp:Label id="lnk_Previous" runat="server" visible="false"/>
<asp:Label id="lnk_Pages" runat="server"/>
<asp:Label id="lnk_Next" runat="server" visible="false"/>
</form>
</body>
</html>
Un saludo grande.
---------------------Luego de la edicion --------------------------
Me di cuenta de porque no funcionaba lo del PostBack, era que en realidad nunca esta haciendo un postback, sino recargando la página. De todas formas, probé haciendo postback y lo mismo me da error. Hay algo que no entiendo. Supuestamente si yo dentro de If Not isPostBack then... me conecto a la base de datos, y cargo un dataset, no se puede seguir usando este DataSet fuera del postback?, porque el error que me sale es el siguiente:
Referencia a objeto no establecida como instancia de un objeto.
Eso me sale en las lineas que trato de rellenar el datatable que verá el usuario con el datatable que tengo en el DS.
Alguien me podría orientar en esto?
Un saludo, y olvidense del código entonces, porque lo que quería hacer hasta que no arregle ese tema no es mi objetivo. Mi objetivo es que se conecte una sola ves a la base de datos, se llene una sola ves un único dataset, se cree una sola vez una única tabla, y la única que se actualiza para mostrar los diferentes resultados al usuario sería esta última tabla.
Ahora ya entré en dudas si se podrá hacer eso.
Un saludo!.
Suerte!.