JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Funcionalidad AJAX en el control GridView de ASP.NET 2.0

Volviendo un poco sobre el tema de AJAX que ya he tratado en muchos de los post anteriores, voy a hacer un pequeño comentario respecto a dotar de funcionalidad similar a la esperada en un entorno AJAX cuando estamos usando el nuevo control GridView de ASP.NET 2.0.

Como es sabido este estupendo control nos permite dotar de funcioalidades de paginación y ordenación de datos a un origen de datos sin necesidad de escribir código alguno. Lo que ya no sabe mucha otra gente es que, además, en la mayoría de los casos se puede conseguir esta funcionalidad sin tener que refrescar la página completa, al más puro estilo AJAX. De este modo al pulsar sobre la cabecera de la rejilla o al cambiar de página se recargan exclusivamente los contenidos de ésta, pero sin realizar un "PostBack" al servidor que fuerza el refresco de la página completa.

Para ello sólo es necesario establecer a true la propiedad EnableSortingAndPagingCallbacks del control, como ilustra la figura del lateral.

Al hacerlo se consigue este efecto tan útil y espectacular. Para ello lo que han hecho los programadores de ASP.NET es implementar la interfaz ICallBackEventHandler en el control GridView, y en concreto en el código de los métodos GetCallBackResultRaiseCallbackEvent. Se puede ver el códgo con cualquier decompilador:

protected virtual string GetCallbackResult()
{
  StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
  HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
  IStateFormatter formatter1 = this.StateFormatter;
  this.RenderTableContents(writer2);
  writer2.Flush();
  writer2.Close();
  string text1 = formatter1.Serialize(this.SaveDataKeysState());
  string text2 = formatter1.Serialize(this.SortExpression);
  return (Convert.ToString(this.PageIndex, CultureInfo.InvariantCulture) + "|" + Convert.ToString((int) this.SortDirection, CultureInfo.InvariantCulture) + "|" + text2 + "|" + text1 + "|" + writer1.ToString());
}

y

protected virtual void RaiseCallbackEvent(string eventArgument)
{
  string[] textArray1 = eventArgument.Split(new char[] { '|' });
  IStateFormatter formatter1 = this.StateFormatter;
  base.ValidateEvent(this.UniqueID, "\"" + textArray1[0] + "|" + textArray1[1] + "|" + textArray1[2] + "|" + textArray1[3] + "\"");
  this.LoadHiddenFieldState(textArray1[4], textArray1[5], textArray1[6], textArray1[7]);
  int num1 = int.Parse(textArray1[0], CultureInfo.InvariantCulture);
  string text1 = textArray1[2];
  int.Parse(textArray1[1], CultureInfo.InvariantCulture);
  if (num1 == this.PageIndex)
  {
    SortDirection direction1 = SortDirection.Ascending;
    string text2 = (string) formatter1.Deserialize(text1);
    if ((text2 == this.SortExpressionInternal) && (this.SortDirectionInternal == SortDirection.Ascending))
    {
      direction1 = SortDirection.Descending;
    }
    this.SortExpressionInternal = text2;
    this.SortDirectionInternal = direction1;
    this._pageIndex = 0;
  }
  else
  {
    this.EditIndex = -1;
    this._pageIndex = num1;
  }
  this.DataBind();
}

Dentro de unos días, en cuanto saque tiempo, intentaré publicar unos cuantos post sobre cómo implementar este tipo de llamadas asíncronas estilo AJAX con lo que nos ofrece "de serie" la plataforma .NET 2.0. La verdad es que es un tema muy chulo, ya lo vereis, y así le doy una cierta continuidad a la serie sobre AJAX que comencé ateriormente.

Un par de cosas a tener en cuenta

Ojo con esta propiedad. Aunque es muy útil y funciona muy bien en muchos casos tiene un par de cuestiones que se deben tener en cuenta para que funcione.

Primero: no funcionará si metemos alguna columna de la rejilla que sea una plantilla, es decir, alguna que no sea un control BoundField o derivado que son los que añade autoáticamente el GridView y cuyo HTM es capaz de generr por si mismo. Si metemos una plantilla la próxima vez que ejecutemos la página que contiene la rejilla se producirá una excepción que nos avisa precisamente de eso.

Segundo: si no hemos usado como origen de datos un control (un SqlDataSource o un ObjectDataSource, etc...) no funcionará la ordenación ni la paginación estilo AJAX. Ello es debido a que se debe llamar a DataBind al final (puedes verlo en el código anterior) y por lo tanto debe haber algún control enlazado permanentemente a la rejilla. Lo explican los chicos de Microsoft en la Web de comentarios del producto de MSDN.

Ya sabeis como quedar biencon vuestros clientes y colegas gracias a esta propiedad :-)

José Manuel Alarcón
Banner

Agregar comentario