How to: Use ASP.NET Dynamic Data in Templated Data-Bound Controls
You can use ASP.NET Dynamic Data with data-bound controls that use templates such as ListView, FormView and Repeater. By working with templates, you can have complete control over the layout and appearance of the data in the control, but the pages are specific for the table you are working with since the templates cannot automatically generate columns. This is useful when you want to create custom pages that use Dynamic Data features with the templated data-bound controls.
When you work with templated data-bound controls, you can add the DynamicControl control to your templates to make use of the Dynamic Data functionality. When you use a DynamicControl control, you take advantage of the following Dynamic Data features:
Automatically rendering the proper control for a field, based on the data type.
Control templates for rendering each data type, which can be globally modified for the entire application.
Providing built-in data validation based on the database schema.
Customizing data rendering for individual fields by using attributes in the data model or by using the UIHint property. For more information, see ASP.NET Dynamic Data Model Overview and How to: Customize Data Field Appearance and Behavior in a Dynamic Data Control, respectively.
In addition to using the DynamicControl control in templated data-bound controls, you can use it in a TemplateField field of a GridView or a DetailsView control.
See a run-time code example of this feature: Run.
To add a DynamicControl control to display data
Add a DynamicControl control to one of the templates of the data-bound control.
Note
Usually you add read-only fields in the ItemTemplate template of templated controls, because that is the template responsible for displaying data. However, you can also add a read-only field to other templates when you do not want the field value to be modified.
Set the DataField property to the name of the column that you want to display, as shown in the following example:
<asp:DynamicControl DataField="ProductName" runat="server" />
Repeat the preceding steps for each data field that you want to display.
To add a DynamicControl control for edit operations
Add a DynamicControl control to the EditItemTemplate template of the data-bound control or template field.
Set the DataField property to the name of the column that you want to edit.
Set the Mode property to the Edit, as shown in the following example:
<asp:DynamicControl DataField="ProductName" Mode="Edit" runat="server" />
Repeat the preceding steps for each data field that you want to edit.
To add a DynamicControl control for insert operations
Add a DynamicControl control to the InsertItemTemplate template of the data-bound control or template field.
Set the DataField property to the name of the column that you want to insert data for.
Set the Mode property to the Insert, as shown in the following example:
<asp:DynamicControl DataField="ProductName" Mode="Insert" runat="server" />
Repeat the preceding steps for each data field that you want to insert data for.
Example
The following example shows a FormView control that uses DynamicControl controls to create a custom page that uses Dynamic Data features.
<%@ Page Language="VB" %>
<script runat="server">
ProtectedSub Page_Init(ByVal sender AsObject, ByVal e As System.EventArgs)
DynamicDataManager1.RegisterControl(FormView1)
EndSub
</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 runat="server">
<title>DynamicControl and Templated Data-Bound Controls Sample</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>Address Table</h2>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" EnableClientScript="true"
HeaderText="List of validation errors" />
<asp:DynamicValidator runat="server" ID="DynamicValidator1"
ControlToValidate="FormView1" Display="None" />
<asp:DynamicDataManager ID="DynamicDataManager1" runat="server"
AutoLoadForeignKeys="true" />
<asp:FormView ID="FormView1" runat="server"
DataSourceID="FormDataSource"
AllowPaging="true">
<ItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine1" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine2" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl runat="server" DataField="City" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl runat="server" DataField="StateProvince" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl runat="server" DataField="CountryRegion" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl runat="server" DataField="PostalCode" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" runat="server" CommandName="New" CausesValidation="false" Text="New" />
<asp:LinkButton ID="EditButton" runat="server" CommandName="Edit" CausesValidation="false" Text="Edit" />
<asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" CausesValidation="false" Text="Delete" />
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Edit" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Edit" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl runat="server" DataField="City" Mode="Edit" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl runat="server" DataField="StateProvince" Mode="Edit" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Edit" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl runat="server" DataField="PostalCode" Mode="Edit" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update">Update</asp:LinkButton>
<asp:LinkButton ID="CancelEditButton" runat="server" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Insert" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Insert" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl runat="server" DataField="City" Mode="Insert" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl runat="server" DataField="StateProvince" Mode="Insert" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Insert" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl runat="server" DataField="PostalCode" Mode="Insert" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="CancelInsertButton" runat="server" 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" runat="server"
TableName="Addresses"
ContextTypeName="AdventureWorksLTDataContext"
EnableDelete="true"
EnableInsert="true"
EnableUpdate="true">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<script runat="server">
protectedvoid 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 runat="server">
<title>DynamicControl and Templated Data-Bound Controls Sample</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>Address Table</h2>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" EnableClientScript="true"
HeaderText="List of validation errors" />
<asp:DynamicValidator runat="server" ID="DynamicValidator1"
ControlToValidate="FormView1" Display="None" />
<asp:DynamicDataManager ID="DynamicDataManager1" runat="server"
AutoLoadForeignKeys="true" />
<asp:FormView ID="FormView1" runat="server"
DataSourceID="FormDataSource"
AllowPaging="true">
<ItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine1" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine2" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl runat="server" DataField="City" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl runat="server" DataField="StateProvince" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl runat="server" DataField="CountryRegion" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl runat="server" DataField="PostalCode" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" runat="server" CommandName="New" CausesValidation="false" Text="New" />
<asp:LinkButton ID="EditButton" runat="server" CommandName="Edit" CausesValidation="false" Text="Edit" />
<asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" CausesValidation="false" Text="Delete" />
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Edit" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Edit" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl runat="server" DataField="City" Mode="Edit" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl runat="server" DataField="StateProvince" Mode="Edit" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Edit" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl runat="server" DataField="PostalCode" Mode="Edit" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update">Update</asp:LinkButton>
<asp:LinkButton ID="CancelEditButton" runat="server" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Insert" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Insert" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl runat="server" DataField="City" Mode="Insert" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl runat="server" DataField="StateProvince" Mode="Insert" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Insert" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl runat="server" DataField="PostalCode" Mode="Insert" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="CancelInsertButton" runat="server" 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" runat="server"
TableName="Addresses"
ContextTypeName="AdventureWorksLTDataContext"
EnableDelete="true"
EnableInsert="true"
EnableUpdate="true">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
Compiling the Code
This example requires:
A Dynamic Data Web site or a Dynamic Data Web application.
Either the AdventureWorks or the AdventureWorksLT sample database. For information about how to download and install the SQL Server sample, see Microsoft SQL Server Product Samples: Database on the CodePlex site. Make sure that you install the correct version of the sample database for the version of SQL Server that you are running (SQL Server 2005 or SQL Server 2008).
A LINQ to SQL class that is configured to access the Address table of the AdventureWorks or AdventureWorksLT database.
The data context is registered with the Dynamic Data engine in the Global.asax file.
The columns rowguid and ModifiedData from the Address table are set to be auto generated in the Object Relational designer. In other words, make sure that the IsDbGenerated property for these two columns is set to true. This is required for the insert operation only.
Robust Programming
The following conditions may cause an exception:
- The database is unavailable.
See Also
Concepts
ASP.NET Dynamic Data Model Overview
Reference
Change History
Date |
History |
Reason |
---|---|---|
July 2008 |
Added topic for new feature. |
SP1 feature change. |