t;asp:QueryStringParameter Name="PhotoID" DefaultValue="9" QueryStringField="ID" />
</SelectParameters>
</asp:ObjectDataSource>
GridView和DetailsView还支持模板化UI,它是通过给Columns或Fields集合增加TemplateField来实现的。TemplateField支持使用ItemTemplate、EditItemTemplate和InsertItemTemplate(DetailsView才有)为控件的不同显示模式中的字段指定UI。与上面的FormView示例类似,EditItemTemplate或InsertItemTemplate中的双向数据绑定也允许GridView或DetailsView从这些模板的控件中提取值。TemplateField最常见的用途是给EditItemTemplate增加验证器控件,用于公开地验证GridView或DetailsView操作。下面的例子演示了这种技术。
……
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" AllowPaging="True" AllowSorting="True" DataKeyNames="AlbumID">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField ReadOnly="True" HeaderText="AlbumID" DataField="AlbumID" SortExpression="AlbumID" />
<asp:TemplateField HeaderText="AlbumName" SortExpression="AlbumName" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text=''''<%# Eval("AlbumName") %>''''></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text=''''<%# Bind("AlbumName") %>''''></asp:TextBox>
<asp:RequiredFieldValidator ControlToValidate="TextBox1" ErrorMessage="AlbumName cannot be empty" ID="RequiredFieldValidator1" Display="Dynamic" runat="server">*</asp:RequiredFieldValidator>
</EditItemTemplate>
</asp:TemplateField>
……
</asp:GridView><br />
<asp:ValidationSummary ID="ValidationSummary1" runat="server" />
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" ConvertNullToDBNull="true"
TypeName="DataComponentTableAdapters.AlbumsTableAdapter" SelectMethod="GetAlbumsByOwner" UpdateMethod="Update" OldValuesParameterFormatString="original_{0}">
……
</asp:ObjectDataSource>
TemplateField的另外一种用途是定制给GridView或DetailsView列/字段输入值的控件。例如,你可以在TemplateField的EditItemTemplate中放置一个DropDownList,允许用户从预定义的值列表中选择。下面的例子演示了这种技术。请注意,示例中的下拉列表绑定到了自己的数据源控件,以动态地获取列表值。
<asp:TemplateField HeaderText="Owner" SortExpression="Owner">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text=''''<%# Eval("Owner") %>''''></asp:Label>
</ItemTempla