Cómo: Usar datos dinámicos de ASP.NET en controles enlazados a datos con plantillas
Actualización: noviembre 2007
Puede utilizar los datos dinámicos de ASP.NET con controles enlazados a datos que utilizan plantillas como ListView, FormView y Repeater. Al trabajar con plantillas, puede tener el control completo sobre el diseño y aspecto de los datos del control, pero las páginas son específicas de la tabla con la que está trabajando porque las plantillas no pueden generar columnas automáticamente. Esto es útil si desea crear páginas personalizadas que utilicen características de los datos dinámicos con los controles enlazados a datos con plantilla.
Si trabaja con controles enlazados a datos con plantilla, puede agregar el control DynamicControl a las plantillas para utilizar la funcionalidad de los datos dinámicos. Cuando use un control DynamicControl, pueden aprovechar las siguientes características de los datos dinámicos:
Representar automáticamente el control apropiado para un campo, basado en el tipo de datos.
Controlar las plantillas para representar cada tipo de datos, que se pueden modificar globalmente para toda la aplicación.
Proporcionar una validación de datos integrada basada en el esquema de base de datos.
Personalizar la representación de los datos de campos individuales mediante el uso de atributos del modelo de datos o la propiedad UIHint. Para obtener más información, vea Información general sobre el modelo de datos dinámicos de ASP.NET y Cómo: Personalizar la apariencia y el comportamiento de los campos de datos en un control de datos dinámicos respectivamente.
Además de utilizar el control DynamicControl en controles enlazados a datos con plantilla, puede utilizarlo en un campo TemplateField de un control DetailsView o GridView.
Ejecute un ejemplo en línea de esta característica.
Para agregar un control DynamicControl para mostrar datos
Agregue un control DynamicControl a una de las plantillas del control enlazado a datos.
Nota: Normalmente se agregan campos de solo lectura a la plantilla ItemTemplate de los controles con plantilla, porque es la plantilla responsable de mostrar los datos. Sin embargo, también puede agregar un campo de solo lectura a otras plantillas si no desea modificar el valor del campo.
Establezca la propiedad DataField en el nombre de la columna que desea mostrar, como se explica en el ejemplo siguiente:
<asp:DynamicControl DataField="ProductName" />
Nota: El valor predeterminado de la propiedad Mode es ReadOnly, de modo que no hace falta establecer esta propiedad para mostrar solo datos.
Repita los pasos anteriores para cada campo de datos que desee mostrar.
Para agregar un control DynamicControl para las operaciones de edición
Agregue un control DynamicControl a la plantilla EditItemTemplate del control enlazado a datos o campo de plantilla.
Establezca la propiedad DataField al nombre de la columna que desee modificar.
Establezca la propiedad Mode en el campo Edit, como se muestra en el ejemplo siguiente:
<asp:DynamicControl DataField="ProductName" Mode="Edit" />
Repita los pasos anteriores para cada campo de datos que desee modificar.
Para agregar un control DynamicControl para las operaciones de inserción
Agregue un control DynamicControl a la plantilla InsertItemTemplate del control enlazado a datos o campo de plantilla.
Establezca la propiedad DataField en el nombre de la columna para la que desee insertar datos.
Establezca la propiedad Mode en el campo Insert, como se muestra en el ejemplo siguiente:
<asp:DynamicControl DataField="ProductName" Mode="Insert" />
Repita los pasos anteriores para cada campo de datos para el que desee insertar datos.
Ejemplo
El ejemplo siguiente muestra un control FormView que utiliza controles DynamicControl para crear una página personalizada que use las características de los datos dinámicos.
<%@ Page Language="VB" %>
<script >
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
DynamicDataManager1.RegisterControl(FormView1)
End Sub
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<title>DynamicControl and Templated Data-Bound Controls Sample</title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" >
<div>
<h2>Address Table</h2>
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<asp:FormView ID="FormView1"
DataSourceID="FormDataSource"
AllowPaging="true">
<ItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="New" CausesValidation="false" Text="New" />
<asp:LinkButton ID="EditButton" CommandName="Edit" CausesValidation="false" Text="Edit" />
<asp:LinkButton ID="DeleteButton" CommandName="Delete" CausesValidation="false" Text="Delete" />
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Edit" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Edit" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Edit" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Edit" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Edit" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Edit" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" CommandName="Update">Update</asp:LinkButton>
<asp:LinkButton ID="CancelEditButton" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Insert" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Insert" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Insert" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Insert" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Insert" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Insert" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="CancelInsertButton" CommandName="Cancel" CausesValidation="false" Text="Cancel" />
</td>
</tr>
</table>
</InsertItemTemplate>
<PagerSettings Position="Bottom" Mode="NumericFirstLast" />
</asp:FormView>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorksLT sample database. -->
<asp:LinqDataSource ID="FormDataSource"
TableName="Addresses"
ContextTypeName="AdventureWorksLTDataContext"
EnableDelete="true"
EnableInsert="true"
EnableUpdate="true">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<script >
protected void Page_Init(object sender, EventArgs e) {
DynamicDataManager1.RegisterControl(FormView1);
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<title>DynamicControl and Templated Data-Bound Controls Sample</title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" >
<div>
<h2>Address Table</h2>
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<asp:FormView ID="FormView1"
DataSourceID="FormDataSource"
AllowPaging="true">
<ItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="New" CausesValidation="false" Text="New" />
<asp:LinkButton ID="EditButton" CommandName="Edit" CausesValidation="false" Text="Edit" />
<asp:LinkButton ID="DeleteButton" CommandName="Delete" CausesValidation="false" Text="Delete" />
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Edit" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Edit" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Edit" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Edit" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Edit" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Edit" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" CommandName="Update">Update</asp:LinkButton>
<asp:LinkButton ID="CancelEditButton" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Insert" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Insert" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Insert" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Insert" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Insert" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Insert" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="CancelInsertButton" CommandName="Cancel" CausesValidation="false" Text="Cancel" />
</td>
</tr>
</table>
</InsertItemTemplate>
<PagerSettings Position="Bottom" Mode="NumericFirstLast" />
</asp:FormView>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorksLT sample database. -->
<asp:LinqDataSource ID="FormDataSource"
TableName="Addresses"
ContextTypeName="AdventureWorksLTDataContext"
EnableDelete="true"
EnableInsert="true"
EnableUpdate="true">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
Compilar el código
Este ejemplo necesita:
Un sitio web de datos dinámicos o una aplicación web de datos dinámicos.
La base de datos de ejemplo AdventureWorks o AdventureWorksLT. Para obtener información sobre la forma de descargar e instalar la base de datos de ejemplo de SQL Server, vea Microsoft SQL Server Product Samples: Database en el sitio CodePlex. Asegúrese de que instala la versión correcta de la base de datos de ejemplo para la versión de SQL Server que esté ejecutando (SQL Server 2005 o SQL Server 2008).
Una clase de LINQ to SQL configurada para tener acceso a la tabla Address de la base de datos AdventureWorks o AdventureWorksLT.
El contexto de datos se registra con el motor de datos dinámicos en el archivo Global.asax.
Las columnas rowguid y ModifiedData de la tabla Address están configuradas para que se generen automáticamente en el Diseñador relacional de objetos. En otras palabras, asegúrese de que la propiedad IsDbGenerated de estas dos columnas está establecida en true. Esto solo es necesario para la operación de inserción.
Programación eficaz
Las condiciones siguientes pueden provocar una excepción:
- La base de datos no está disponible.
Vea también
Conceptos
Información general sobre los datos dinámicos de ASP.NET
Información general sobre el modelo de datos dinámicos de ASP.NET