URGENTE: Más problemas con el DataBind
Tenemos el siguiente error: Invalid CurrentPageIndex value. It must be >= 0 and < the PageCount.
El caso es que el error no da ni por el valor del currentPageIndex ni por el del PageCount, porque además de que los dos cumplen las condiciones que deben, el código ha funcionado correctamente un rato.
Los cambios que hemos hecho después de probarlo y ver que funcionaba han sido en otras páginas.
Alguien sabe si la dichosa excepción esa puede saltar por algún otro motivo?? No encontramos el error y tenemos que entregar el proyecto ya mismo.
Gracias por vuestra ayuda, un saludo.
El caso es que el error no da ni por el valor del currentPageIndex ni por el del PageCount, porque además de que los dos cumplen las condiciones que deben, el código ha funcionado correctamente un rato.
Los cambios que hemos hecho después de probarlo y ver que funcionaba han sido en otras páginas.
Alguien sabe si la dichosa excepción esa puede saltar por algún otro motivo?? No encontramos el error y tenemos que entregar el proyecto ya mismo.
Gracias por vuestra ayuda, un saludo.
Hola: pues al final hemos encontrado la solución a nuestro problema, os la ponemos aqui por si a alguno le toca sufrir con los datagrid's:
Veréis, para paginar hay que implementar el código del evento DataGrid_PageIndexChanged, en el que hay que volver a cargar todos los datos en el DataGrid, y luego él mismo se encarga de actualizar sus Ãndices y mostrar lo que toca cada vez (según número de filas a mostrar etc).
Pues el tema es que antes de ejecutarse el código de dicho evento, se ejecuta el del pageLoad, asà que, convine cargar los datos en el PageLoad.
Os ponemos nuestro ejemplo:
/*_________________PAGE LOAD:___________________*/
private void Page_Load(object sender, System.EventArgs e)
{
this.categoria = this.Session.Contents[1].ToString();
this.cargarArray();
if(!this.Page.IsPostBack)
{
this.lUbicacion.Text = "Foro >> "+this.categoria;
string[] aFila;
DataTable dt = new DataTable("prueba");
dt.Columns.Add("Tema");
dt.Columns.Add("Respuestas");
dt.Columns.Add("Autor");
dt.Columns.Add("Ultimo mensaje");
dt.Columns.Add("id_Pregunta");
for(int i=0; i<aPreguntasForo.Length; i++)
{
string tema = aPreguntasForo[i].getTema();
string numPreguntas = aPreguntasForo[i].getNumRespuestas().ToString();
string nick = aPreguntasForo[i].getNick();
string ultimoMensaje = aPreguntasForo[i].getUltimoMensaje();
int id_Pregunta = this.aIdentif[i];
aFila = new string[5];
aFila[0] = tema;
aFila[1] = numPreguntas;
aFila[2] = nick;
aFila[3] = ultimoMensaje;
aFila[4] = id_Pregunta.ToString();
DataRow fila;
dt.BeginLoadData();
fila = dt.LoadDataRow(aFila, true);
dt.EndLoadData();
}
DataSet ds = new DataSet();
ds.Tables.Add(dt);
this.dgMensajes.DataSource = ds.Tables[0];
this.dgMensajes.DataBind();
}
}
/*_____________________EVENTO:__________________*/
private void dgMensajes_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
{
string[] aFila;
DataTable dt = new DataTable("prueba");
dt.Columns.Add("Tema");
dt.Columns.Add("Respuestas");
dt.Columns.Add("Autor");
dt.Columns.Add("Ultimo mensaje");
dt.Columns.Add("id_Pregunta");
for(int i=0; i<aPreguntasForo.Length; i++)
{
string tema = aPreguntasForo[i].getTema();
string numPreguntas = aPreguntasForo[i].getNumRespuestas().ToString();
string nick = aPreguntasForo[i].getNick();
string ultimoMensaje = aPreguntasForo[i].getUltimoMensaje();
int id_Pregunta = this.aIdentif[i];
aFila = new string[5];
aFila[0] = tema;
aFila[1] = numPreguntas;
aFila[2] = nick;
aFila[3] = ultimoMensaje;
aFila[4] = id_Pregunta.ToString();
DataRow fila;
dt.BeginLoadData();
fila = dt.LoadDataRow(aFila, true);
dt.EndLoadData();
}
DataSet ds = new DataSet();
ds.Tables.Clear();
ds.Tables.Add(dt);
this.dgMensajes.DataSource = ds.Tables[0];
this.dgMensajes.CurrentPageIndex = e.NewPageIndex;
this.Label1.Text = "CurrentPageIndex: "+this.dgMensajes.CurrentPageIndex.ToString()+" PageCount: "+this.dgMensajes.PageCount.ToString();
this.dgMensajes.DataBind();
}
Veréis, para paginar hay que implementar el código del evento DataGrid_PageIndexChanged, en el que hay que volver a cargar todos los datos en el DataGrid, y luego él mismo se encarga de actualizar sus Ãndices y mostrar lo que toca cada vez (según número de filas a mostrar etc).
Pues el tema es que antes de ejecutarse el código de dicho evento, se ejecuta el del pageLoad, asà que, convine cargar los datos en el PageLoad.
Os ponemos nuestro ejemplo:
/*_________________PAGE LOAD:___________________*/
private void Page_Load(object sender, System.EventArgs e)
{
this.categoria = this.Session.Contents[1].ToString();
this.cargarArray();
if(!this.Page.IsPostBack)
{
this.lUbicacion.Text = "Foro >> "+this.categoria;
string[] aFila;
DataTable dt = new DataTable("prueba");
dt.Columns.Add("Tema");
dt.Columns.Add("Respuestas");
dt.Columns.Add("Autor");
dt.Columns.Add("Ultimo mensaje");
dt.Columns.Add("id_Pregunta");
for(int i=0; i<aPreguntasForo.Length; i++)
{
string tema = aPreguntasForo[i].getTema();
string numPreguntas = aPreguntasForo[i].getNumRespuestas().ToString();
string nick = aPreguntasForo[i].getNick();
string ultimoMensaje = aPreguntasForo[i].getUltimoMensaje();
int id_Pregunta = this.aIdentif[i];
aFila = new string[5];
aFila[0] = tema;
aFila[1] = numPreguntas;
aFila[2] = nick;
aFila[3] = ultimoMensaje;
aFila[4] = id_Pregunta.ToString();
DataRow fila;
dt.BeginLoadData();
fila = dt.LoadDataRow(aFila, true);
dt.EndLoadData();
}
DataSet ds = new DataSet();
ds.Tables.Add(dt);
this.dgMensajes.DataSource = ds.Tables[0];
this.dgMensajes.DataBind();
}
}
/*_____________________EVENTO:__________________*/
private void dgMensajes_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
{
string[] aFila;
DataTable dt = new DataTable("prueba");
dt.Columns.Add("Tema");
dt.Columns.Add("Respuestas");
dt.Columns.Add("Autor");
dt.Columns.Add("Ultimo mensaje");
dt.Columns.Add("id_Pregunta");
for(int i=0; i<aPreguntasForo.Length; i++)
{
string tema = aPreguntasForo[i].getTema();
string numPreguntas = aPreguntasForo[i].getNumRespuestas().ToString();
string nick = aPreguntasForo[i].getNick();
string ultimoMensaje = aPreguntasForo[i].getUltimoMensaje();
int id_Pregunta = this.aIdentif[i];
aFila = new string[5];
aFila[0] = tema;
aFila[1] = numPreguntas;
aFila[2] = nick;
aFila[3] = ultimoMensaje;
aFila[4] = id_Pregunta.ToString();
DataRow fila;
dt.BeginLoadData();
fila = dt.LoadDataRow(aFila, true);
dt.EndLoadData();
}
DataSet ds = new DataSet();
ds.Tables.Clear();
ds.Tables.Add(dt);
this.dgMensajes.DataSource = ds.Tables[0];
this.dgMensajes.CurrentPageIndex = e.NewPageIndex;
this.Label1.Text = "CurrentPageIndex: "+this.dgMensajes.CurrentPageIndex.ToString()+" PageCount: "+this.dgMensajes.PageCount.ToString();
this.dgMensajes.DataBind();
}
hola! hay que tener en cuentra que en ASP.NET siempre que se carga una pagina, ya sea por primera vez o por un evento (ckick de boton, paginacion de datagrid, etc etc), siempre se ejecutan los eventos: page_load, page_init y page_preRender, en este orden, y siempre antes que los eventos de los controles de la pagina.
Esta es la manera de funcionar de ASP.NET, asi que no hay manera de evitarlo, siempre hay que cargar los datos de una pagina en el page_load, ya que sino se perderan al producirse cualquier evento.
hasta otra!
Esta es la manera de funcionar de ASP.NET, asi que no hay manera de evitarlo, siempre hay que cargar los datos de una pagina en el page_load, ya que sino se perderan al producirse cualquier evento.
hasta otra!
analizando todas las respuestas anteriores y probandolas al fin solucionamos el problema
private void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack == true)
{
GrdAuthors.CurrentPageIndex = 0;
LlenarGrilla();
}
// Put user code to initialize the page here
}
private void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack == true)
{
GrdAuthors.CurrentPageIndex = 0;
LlenarGrilla();
}
// Put user code to initialize the page here
}
