Foros del Web » Programación para mayores de 30 ;) » .NET »

como paginar un repeater

Estas en el tema de como paginar un repeater en el foro de .NET en Foros del Web. Explico mejor la cuestión. Lo que pasa es que lleno un repeater con un DataTable, pero este es llenado hasta que se da un click ...
  #1 (permalink)  
Antiguo 26/10/2004, 11:13
 
Fecha de Ingreso: septiembre-2004
Mensajes: 217
Antigüedad: 19 años, 7 meses
Puntos: 0
Busqueda como paginar un repeater

Explico mejor la cuestión.

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

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.

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.

Espero que me puedan ayudar ya que lo necesito urgentemente.

Muchas gracias y espero su respuesta
  #2 (permalink)  
Antiguo 27/10/2004, 09:48
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
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 para ir a la siguiente o anterior y lo haces por el método Get, te recominiendo que mejor uses un LinkButton (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
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 27/10/2004, 15:03
 
Fecha de Ingreso: septiembre-2004
Mensajes: 217
Antigüedad: 19 años, 7 meses
Puntos: 0
Pregunta

Hola Rootk.
Como siempre agradeciendo tu respuesta.

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:

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?

después debo hacer lo siguiente:

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


eso es lo que yo entiendo pero no muy claramente espero que tu o alguien mas me pueda ayudar y muchas gracias.
  #4 (permalink)  
Antiguo 27/10/2004, 15:46
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
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..

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

Si sigues con dudas por aqui andamos..
  #5 (permalink)  
Antiguo 04/11/2004, 11:19
 
Fecha de Ingreso: septiembre-2004
Mensajes: 217
Antigüedad: 19 años, 7 meses
Puntos: 0
Pregunta 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.

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.

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
  #6 (permalink)  
Antiguo 04/11/2004, 11:36
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Y cual es el code que tienes en tu HTML ?
  #7 (permalink)  
Antiguo 04/11/2004, 11:51
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
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
  #8 (permalink)  
Antiguo 04/11/2004, 11:54
 
Fecha de Ingreso: septiembre-2004
Mensajes: 217
Antigüedad: 19 años, 7 meses
Puntos: 0
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

Bueno aqui esta y espero tu respuesta, gracias.
  #9 (permalink)  
Antiguo 04/11/2004, 11:55
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
Hola:

es el siguiente:
Ya leíste mi respuesta..?? te la acabo de poner..
  #10 (permalink)  
Antiguo 09/11/2004, 15:09
 
Fecha de Ingreso: septiembre-2004
Mensajes: 217
Antigüedad: 19 años, 7 meses
Puntos: 0
Otro problema con al paginación

Hola RootK:

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.

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

lo que realizo hasta el momento es lo siguiente:

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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:05.