Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   como paginar un repeater (http://www.forosdelweb.com/f29/como-paginar-repeater-242014/)

Zyanya_80 26/10/2004 11:13

como paginar un repeater
 
Explico mejor la cuestión. :pensando:

Lo que pasa es que lleno un repeater con un DataTable, pero este es llenado hasta que se da un click en un boton. :si:

He encontrado ejemplos de paginación pero esta la realizan desde el pageLoad y yo la requiero hasta despues de llenar el Repeater con los resultados. :si:

Como puedo hacer para paginar despues de que se da el click y el repeater ya trae todos los resultados. :-(

Enseguida escribo un poco de codigo para que sea un poco mas claro lo que deseo:

DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("consTemas"));
.
.
.
.
.
dt.Columns.Add(new DataColumn(N));
dr = dt.NewRow();
dr[0] = Result.GetValue(i,0);
.
.
.
.
dr[0] = Result.GetValue(n,n);

Para paginar hasta ahorita hago lo siguiente:


PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = new DataView(dt);
objPds.AllowPaging = true;
objPds.PageSize = 10;
int CurPage;
if (Request.QueryString["Page"] != null)
CurPage=Convert.ToInt32(Request.QueryString["Page"]);
else
CurPage=1;
objPds.CurrentPageIndex = CurPage-1;
if (objPds.IsFirstPage)
lnkPrev.NavigateUrl=Request.CurrentExecutionFilePa th + "?Page=" + Convert.ToString(CurPage-1);

if (!objPds.IsLastPage)
lnkNext.NavigateUrl=Request.CurrentExecutionFilePa th+ "?Page=" + Convert.ToString(CurPage+1);

Repeater1.DataSource=objPds;
Repeater1.DataBind();

Esto si me ayuda a paginar pero lo realiza una sola vez y solo me muestra los 10 primeros resultados. Como puedo hacer para que me muestre todos los demas. :pensando:

Espero que me puedan ayudar ya que lo necesito urgentemente. :neurotico

Muchas gracias y espero su respuesta :adios:

RootK 27/10/2004 09:48

Si estas usando la clase PagedDataSource(); para ir a la página siguiente checa la propiedad:

Cita:

objPaged.CurrentPageIndex = iPage
Donde puede ser cualquier valor entero, dependiendo de tu boton siguiente o anterior.

Al parecer estás usando un hyperlink :pensando: para ir a la siguiente o anterior y lo haces por el método Get, te recominiendo que mejor uses un LinkButton :arriba: (para hacer postback y no un load de page) y guardes por ejemplo en una label la CurrentPage y si es anterior le sumes a ese valor actual 1 en caso contrario -1, con ello te ahorras el Request.QueryString["Page"].


Salu2

Zyanya_80 27/10/2004 15:03

Hola Rootk.
Como siempre agradeciendo tu respuesta. :-D

No entiendo muy bien como utilizar el LinkButton, es que la verdad no tengo mucha experiencia en .NET y apenas comienzo a conocer el repeater.
:-(
Lo que entendi fue lo siguiente: :pensando:

tengo las siguientes lineas de codigo:

PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = new DataView(dt);
objPds.AllowPaging = true;
objPds.PageSize = 10;
int CurPage;

en CurPage guardo CurrentPageIndex y lo asigno a un Label no a el LinkButton o si? :pensando:

después debo hacer lo siguiente:

si CurrentPageIndex = LinkButtonPrevio entonces CurPage-1
si no CurPage+1
:pensando:

eso es lo que yo entiendo pero no muy claramente espero que tu o alguien mas me pueda ayudar y muchas gracias. :adios:

RootK 27/10/2004 15:46

Mira éste post donde puse un ejemplo usando un datalist.

http://www.forosdelweb.com/f29/ejemplo-para-moverse-entre-registro-con-asp-net-203407/

Solo adaptalo a tu repeater.. :arriba:

Yo hago la paginacion de forma diferente, pero te podrá servir.

Si sigues con dudas por aqui andamos.. :cool:

Zyanya_80 04/11/2004 11:19

Continuo con problemas para paginar
 
Hola Rootk:

Fijate que continuo con los problemas para paginar te explico lo que estoy haciendo de acuerdo al ejemplo que esta en la liga y lo que yo realizo en mi programa. :pensando:

En mi código:

private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
intPageSize.Text="10";
intCurrIndex.Text="0";
Bin();
}
}

private void Button1_Click(object sender, System.EventArgs e)
{
Result =(strResult.SeleccionaSeccionBusqueda(strSecBus,st rTexto,metodoBus,ent,Repos,inAnalogias,cveNiv,repo s));
// Result es un vector de 11 columnas y un número variable de renglones

Bin();
}

private void Bin()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("consTemas"));
dt.Columns.Add(new DataColumn("cveNivel"));
dt.Columns.Add(new DataColumn("cveEntidad"));
dt.Columns.Add(new DataColumn("urlDato"));
dt.Columns.Add(new DataColumn("urlMetadato"));
dt.Columns.Add(new DataColumn("cveRepositorio"));
dt.Columns.Add(new DataColumn("nodo"));
dt.Columns.Add(new DataColumn("nodoTrabajo"));
dt.Columns.Add(new DataColumn("imagen"));
dt.Columns.Add(new DataColumn("hintDato"));
dt.Columns.Add(new DataColumn("descr"));
int tem =Result.Length/11;

for (i= 0; i < tem; i++)
{
dr = dt.NewRow();
dr[0] = Result.GetValue(i,0);
dr[1] = Result.GetValue(i,1);
dr[2] = Result.GetValue(i,2);
dr[3] = Result.GetValue(i,3);
dr[4] = Result.GetValue(i,4);
dr[6] = Result.GetValue(i,6);
dr[7] = Result.GetValue(i,7);
dr[8] = Result.GetValue(i,8);
dr[9] = Result.GetValue(i,9);
dr[10] = Result.GetValue(i,10);
dt.Rows.Add(dr);
}
if(intCurrIndex.Text == "0")
{hrefPrevious.Visible = false;}
else{hrefPrevious.Visible= true;}
intRecordCount.Text = new DataView(dt).Count.ToString();
Repeater1.DataSource = new DataView(dt);
Repeater1.DataBind();
}

private void hrefFirst_Click(object sender, System.EventArgs e)
{
intCurrIndex.Text = "0";
Bin();
}

private void hrefPrevious_Click(object sender, System.EventArgs e)
{
int conv = Convert.ToInt32(intCurrIndex.Text);
int pag = Convert.ToInt32(intPageSize.Text);
int resta = conv - pag;
intCurrIndex.Text = resta.ToString();
if(conv < 0)
{intCurrIndex.Text="0";}
Bin();
}

private void hrefNext_Click(object sender, System.EventArgs e)
{
int conv = Convert.ToInt32(intCurrIndex.Text);
int pag = Convert.ToInt32(intPageSize.Text);
int recor = Convert.ToInt32(intRecordCount.Text);
int suma = conv + pag;
if(conv + 1 < recor)
{intCurrIndex.Text = suma.ToString();}
Bin();
}

private void hrefLast_Click(object sender, System.EventArgs e)
{
int tmpInt=0;
int conv = Convert.ToInt32(intCurrIndex.Text);
int pag = Convert.ToInt32(intPageSize.Text);
int recor = Convert.ToInt32(intRecordCount.Text);
tmpInt = recor % pag;
int residuo = conv - tmpInt;
int resta =0;
int resta2=0;
if(tmpInt > 0)
{
resta = recor - tmpInt;
resta2 = recor - pag;
intCurrIndex.Text = resta.ToString();}
else{intCurrIndex.Text = resta2.ToString();}
}


Si te fijas te digo que con referencia a tu codigo tambien por que ya lo incluyo. :si:

Espero que me puedas a yudar para entender que es lo que hago mal ya que quiero que me despliege la primera vez solo 10 resultados y despues de dar un click en cualquiera de los demas botones pues la funcionalidad de cada uno de ellos :'(

Muchas gracias y espero tu respuesta :adios:

RootK 04/11/2004 11:36

Y cual es el code que tienes en tu HTML ?

RootK 04/11/2004 11:51

Ahh..ok.. creo que ya ví el detalle, lo que pasa es que tu estás llenando tu datatable de forma manual y el ejemplo que puse lo hice un dataAdapter y por eso podía paginar.., pero de todas formas tambien lo puedes hacer de la forma en que tu lo necesitas con algunas modificaciones:

Ejemplo:

Si ya tengo mi DataTable lleno (dt) puedo usar otro temporal que es el que voy a llenar dependiendo del tamaño.

Algo como ésto:

Cita:

Dim dtTemp as DataTable = dt.Clone()
'Veo el índice actual
For i = CInt(intCurrIndex.Text) To Cint(intPageSize.Text)
dtTemp.ImportRow(dt.Rows(i))
Next

Repeater1.DataSource = dtTemp
Repeater1.DataBind()
Esa es la idea general (es lo principal), creo que con eso ya será suficiente para que hagas tu paginacion, es cosa de adaptarlo, piensale un poco y verás que no será dificil..

Saludos y suerte :arriba:

Zyanya_80 04/11/2004 11:54

Hola:

es el siguiente:

<%@ Import Namespace="System.Data" %>
<%@ import namespace="System.Data.OleDb" %>
<%@ Page language="c#" Codebehind="Resultados.aspx.cs" AutoEventWireup="false" Inherits="BuscadorNET.Resultados" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Resultados</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<br>
<asp:panel id="Panel1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 64px" runat="server"
Width="100%" Height="499px">
<TABLE style="WIDTH: 472px; HEIGHT: 40px" cellSpacing="1" cellPadding="1" width="472" border="1">
<TR>
<TD style="WIDTH: 52.72%" align="left" height="40">
<asp:TextBox id="TxBPalabra1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Buscar"></asp:Button>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server" ControlToValidate="TxBPalabra1" ErrorMessage="RequiredFieldValidator">El texto de busqueda no ha sido proporcionado</asp:RequiredFieldValidator></TD>
</TR>
</TABLE>

<asp:repeater id="Repeater1" runat="server">
<ItemTemplate>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td><%#((DataRowView) Container.DataItem) [5]%></td>
<td><%#((DataRowView) Container.DataItem) [10]%></td>
</tr> </table>
</ItemTemplate>
<HeaderTemplate>
</HeaderTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:repeater>
</asp:panel>
</form>
</body>
</HTML>


espero que esto te sea un poco mas claro, aunque fantan otros componenetes que utilizo en la forma pero que no creo que tenga mucha importancia ponerlos ya que son botones y listas desplegables :si:

Bueno aqui esta y espero tu respuesta, gracias. :adios:

RootK 04/11/2004 11:55

Cita:

Hola:

es el siguiente: :ojotes:
Ya leíste mi respuesta..?? te la acabo de poner..

Zyanya_80 09/11/2004 15:09

Otro problema con al paginación
 
Hola RootK: :-D

Ya lei tu respuesta muchas gracias fijate que resolvi el problema, pero ahora lo que pretendo es que no solo tenga la funcionalidad del next y Prev sino que me despliege las siguientes 10 paginas, las ultimas 10, que me muestre:
1-2-3-4-5-6-7-8-9-10.... y asi sucesivamente dependiendo del numero de paginas. :si:

perdon yo se que ya di mucha lata pero en realidad lo necesito mucho. :stress:

lo que realizo hasta el momento es lo siguiente: :pensando:

PagedDataSource objPds = new PagedDataSource();
DataView source = (DataView)Cache["Mycache"];
if(source == null)
{
source = new DataView(dt);
Cache["Mycache"] = source;
}
objPds.DataSource = source;
objPds.AllowPaging = true;

int CurPage = 1;
if (Request.QueryString["Page"] != null)
{CurPage=Convert.ToInt32(Request.QueryString["Page"]);}
else{CurPage = 1;}
objPds.CurrentPageIndex = CurPage - 1;
lblCurrentPage.Text = "Page: " + CurPage.ToString() + "de " + objPds.PageCount.ToString();
if (!objPds.IsFirstPage)
{
lnkPrev.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);
}
if (!objPds.IsLastPage)
{
lnkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage+1);
}
Repeater1.DataSource=objPds;
Repeater1.DataBind();

Espero que sea lo ultimo con lo que tenga problemas y muchas gracias por tomarte la molestia de contestar. :adios:


La zona horaria es GMT -6. Ahora son las 23:43.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.