Share via


Expresiones de enlace de datos para páginas de formularios Web Forms

El enlace de datos de las propiedades de los controles individuales de las páginas de formularios Web Forms no se implementa directamente uniendo la propiedad a un origen de datos, sino que es preciso usar un formato especial de expresión. La información sobre los datos que se desean enlazar se incorpora a la expresión y, a continuación, se asigna el resultado de ésta a una propiedad del control.

Por ejemplo, si se desea enlazar un control de servidor Web TextBox con unos datos, se deberá crear una expresión de enlace de datos y asignarla a la propiedad Text del control de forma que el valor se muestre en el control.

El ejemplo siguiente muestra la apariencia que podría tener la declaración del control en la vista HTML. La propiedad Text del control está enlazada a una vista de datos que contiene un único registro. La expresión de enlace de datos está delimitada por los caracteres <%# y %>.

<asp:TextBox id="TextBox1" runat="server" 
   Text='<%# DataView1(0)("au_lname") %>'>
</asp:TextBox>

De forma similar, puede utilizar una expresión de enlace de datos para establecer la propiedad ImageUrl de un control de servidor Web Image. En ese caso, se extrae una cadena de la base de datos que contiene la ruta de acceso y el nombre de archivo del gráfico que se presenta. Un ejemplo podría tener el siguiente aspecto:

<asp:Image id=Image1 runat="server" 
   ImageUrl='<%# DataView(0)("productPhotoURL") %>'>

En Visual Studio, la ventana Propiedades proporciona una herramienta para crear expresiones de enlace de datos. Como alternativa, se pueden crear personalmente e introducirlas en la vista HTML del diseñador de Web Forms.

Ventajas de las expresiones de enlace de datos

Usar una expresión para enlazar datos aporta flexibilidad en varios aspectos:

  • Se puede usar cualquier expresión, siempre y cuando se resuelva en un valor o valores que el control pueda utilizar. En la mayoría de los casos, las expresiones de enlace de datos se resuelven en un valor derivado de un origen de datos, pero pueden también hacer referencia a propiedades de la página o de otros controles, a valores que se pueden calcular en tiempo de ejecución o casi a cualquier otro elemento.
  • Se puede asignar la expresión a cualquier propiedad, es decir, se puede enlazar cualquier propiedad con datos. Por ejemplo, se puede guardar información sobre las preferencias del usuario en una base de datos y usar el enlace de datos para implementar dichas preferencias en propiedades para fuentes, colores, tamaños, estilos, etc. Además, se puede enlazar más de una propiedad de un control, lo que permite enlazar una propiedad a un origen de datos y otra a otro origen distinto.

Utilizar la clase DataBinder para enlazar

Aunque se pueden enlazar datos usando casi cualquier expresión que se resuelva en un valor, en la mayoría de los casos se enlaza con un origen de datos de algún tipo. Éste suele ser una tabla en un conjunto de datos o una vista de datos que contiene el único registro que le interesa. Para simplificar este tipo de enlace a datos, los controles de servidor ASP.NET admiten una clase denominada DataBinder que realiza parte del trabajo de extracción de datos y de ponerlos a disposición de una propiedad de un control.

La clase DataBinder se usa invocando su método Eval, que requiere dos parámetros:

  • Una referencia al contenedor de datos, normalmente el conjunto de datos, la tabla de datos o la vista de datos.
  • Una referencia al valor individual que se va a derivar. Esto a menudo hace referencia a una fila única (fila cero) y a un valor de columna de dicha fila.

El ejemplo siguiente muestra el mismo enlace de datos que se realizó anteriormente para un cuadro de texto, pero esta vez usando la clase DataBinder.

<asp:TextBox id="TextBox1" runat="server" 
   Text='<%# DataBinder.Eval(DataView1, "[0].au_lname") %>'>
</asp:TextBox>

El ejemplo anterior, en el que se establecía la propiedad ImageUrl de un control Image, podría tener el siguiente aspecto. En este ejemplo, se pasa una expresión de formato en el segundo parámetro opcional del método DataBinder.Eval, que agrega una ruta de acceso a los datos como prefijo.

<asp:Image id=Image1 runat="server" 
   ImageUrl='<%# DataBinder.Eval(Container, "DataItem.ProductImage", "http://myserver/myapps/images/{0}") %>'>

Las ventajas de la clase DataBinder son las siguientes:

  • La sintaxis es coherente para todos los enlaces, ya que la imponen los parámetros necesarios para el método Eval.
  • La clase DataBinder es compatible con las herramientas de diseño de páginas de formularios Web Forms de Visual Studio.
  • La clase realiza la conversión de tipo automáticamente. Por ejemplo, si se enlaza un cuadro de texto con una columna de datos que contenga un entero, la clase DataBinder convertirá el entero automáticamente en cadena.
  • Opcionalmente, puede especificarse una expresión de formato que convierta o rectifique los datos.

Resolver expresiones de enlace de datos

Las expresiones de enlace de datos deben resolverse en tiempo de ejecución para suministrar valores con los que se puedan enlazar los controles. Este paso se realiza explícitamente durante el procesamiento de la página llamando al método DataBind, que es un método de la clase System.Web.UI.Control. Se puede invocar este método para controles individuales o, algo más eficaz aún, se le puede llamar para la clase Page (que también deriva de la clase Control). El método crea una cascada con la llamada a todos los controles secundarios; por tanto, cuando se le llama una sola vez para la página, se le invoca para todos los controles de la misma.

Normalmente se llama al método DataBind bajo estas circunstancias:

  • La primera vez que se ejecuta la página, pero después de que el origen de datos se haya llenado (por ejemplo, después de haber llenado un conjunto de datos).
  • Una vez que el origen de datos ha cambiado (por ejemplo, porque se haya actualizado alguno de sus registros).

El ejemplo siguiente muestra un modo típico de llamar al método DataBind durante el evento de inicialización de la página:

' Visual Basic
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   SqlDataAdapter1.Fill(DsAuthors1, "authors")
   If Not (Me.IsPostBack) Then
     Me.DataBind()
   End If
End Sub

// C#
private void Page_Load(object sender, System.EventArgs e)
{
   SqlDataAdapter1.Fill(dsAuthors1, "authors");
   if (!this.IsPostBack) 
   {
      this.DataBind();
   }
}

Normalmente no resulta deseable invocar el método DataBind en cada acción de ida y vuelta (es decir, en la inicialización de la página sin comprobar si ha habido un reenvío de datos), porque hacer esto reemplaza los valores de los controles. Por ejemplo, si se trabaja con un control DataGrid, éste puede contener cambios que se desea procesar. Cuando se llama a DataBind, el contenido de la cuadrícula se reemplaza por valores del origen de datos. Si esto se hace durante la inicialización de la página, se perderán los cambios de la cuadrícula antes de tener oportunidad de procesarlos. En lugar de esto, normalmente se llama al método DataBind en un controlador de eventos después de haber realizado el procesamiento de los datos del evento.

Vea también

Sintaxis de expresiones de enlace de datos | Enlace a datos de varios registros y de valores únicos para páginas de formularios Web Forms | Enlace de datos en controles de servidor Web de un sólo registro en tiempo de diseño | Enlace de datos de controles de servidor HTML