5.5 操作一条记录
ASP.NET 2.0提供了可以操作一条记录的数据控件:DetailsView和FormView。它们和Repeater、DataList、GridView等迭代控件最大的区别在于:迭代控件可以一次显示多条记录,而DetailsView和FormView一次只能显示一条记录。
5.5.1 详细视图控件DetailsView和窗体视图控件FormView
DetailsView和FormView控件非常相似,它们都能够实现显示、编辑、插入或删除数据源中的一条记录,且每一次只能显示或操作一条记录。DetailsView和FormView控件实现的主要功能描述如下。
显示一条记录,即将数据源中的数据绑定到控件。
插入数据,将新数据插入到数据源中。
更新数据,修改当前记录。
删除数据,删除当前记录。
分页功能,分页显示数据中的数据(每一页只能显示一条记录)。
对控件应用主题和样式,并能够在这些主题和样式中自定义外观。
动态处理它们的事件。
由于DetailsView和FormView控件非常相似,因此它们的很多属性也比较相似性。在此,笔者仅介绍FormView控件的属性,如表5-26所示。
表5-26 FormView控件的属性
属 性 |
描 述 |
AllowPaging |
是否启用分页功能 |
PageCount |
数据分页后,所需要的页码总数 |
PageIndex |
当前页的索引 |
PagerSettings |
控件中的页导航按钮的属性 |
BackImageUrl |
控件背景图像的URL |
Caption |
控件的标题 |
CaptionAlign |
控件中的标题排列方式,可以是水平或垂直方式 |
CellPadding |
单元格的内容和单元格的边框之间的空间量 |
CellSpacing |
单元格间的空间量 |
CurrentMode |
控件的当前数据输入模式 |
DefaultMode |
控件的默认模式。控件在更新、插入或取消操作后返回该模式 |
DataItem |
控件的数据项 |
DataItemCount |
数据项的数量 |
DataItemIndex |
从数据源绑定到控件的数据项的索引 |
DataKey |
记录的主键 |
SelectedValue |
控件中的当前记录的数据键值 |
DataKeyNames |
包含数据源的键字段的名称的数组 |
EmptyDataText |
当控件的数据源为空时,控件显示的文本 |
HeaderText |
控件的标题行中显示的文本 |
FooterText |
控件的脚注行中显示的文本 |
HorizontalAlign |
控件在页面上的水平对齐方式 |
GridLines |
控件的网格线样式 |
TopPagerRow |
控件顶部显示的页导航行 |
BottomPagerRow |
控件底部显示的页导航行 |
HeaderRow |
控件的标题行 |
FooterRow |
控件的脚注行 |
Row |
控件的数据行 |
HeaderTemplate |
控件的标题行模板 |
续表
属 性 |
描 述 |
FooterTemplate |
控件的脚注行模板 |
EditItemTemplate |
控件的编辑模板 |
ItemTemplate |
控件的项模板 |
InsertItemTemplate |
控件的插入模板 |
PagerTemplate |
控件的分页模板 |
EmptyDataTemplate |
当控件的数据源为空时,控件显示该模板中的文本 |
HeaderStyle |
控件的标题行的样式 |
FooterStyle |
控件的脚注行的样式 |
EditRowStyle |
控件的编辑行的样式 |
InsertRowStyle |
控件的插入行的样式 |
PagerStyle |
控件的页导航行的样式 |
EmptyDataRowStyle |
控件的空数据行的样式 |
RowStyle |
控件的数据行的样式 |
5.5.2 详细视图控件和窗体视图控件的区别
虽然DetailsView和FormView控件非常相似,但是它们还存在一定的差别,具体描述如下。
DetailsView控件使用表格对控件的内容进行布局,并且数据源中的每一个字段独占一行。
FormView控件使用模板对控件的内容进行布局,这种方式的布局比DetailsView控件灵活。
DetailsView和FormView控件支持的模板种类不相同,具体差别如表5-27所示。
表5-27 DetailsView和FormView控件支持的模板
控 件 |
支持的模板 |
DetailsView |
HeaderTemplate |
FooterTemplate |
|
PagerTemplate |
|
EmptyDataTemplate |
|
FormView |
HeaderTemplate |
FooterTemplate |
|
ItemTemplate |
|
EditItemTemplate |
|
InsertItemTemplate |
|
PagerTemplate |
|
EmptyDataTemplate |
5.5.3 实现“主/从”数据操作
DetailsView和FormView控件都可以显示数据源中的单条记录。它们最常用的功能是与GridView控件一起使用,从而实现被称为“主/从”的数据操作方式。
下面的代码实例声明了一个GridView控件、一个DetailsView控件和两个SqlDataSource控件。它们的ID属性的值分别为gvUser、dvUser、myDSUser和myDSSingleUser。其中,gvUser控件使用数据源控件myDSUser,它仅仅提供数据显示功能。dvUser控件的数据源控件为myDSSingleUser,它可以执行插入、编辑、删除等操作。
注意 |
dvUser控件只显示gvUser控件当前选择行的数据,并对该数据进行插入、编辑、删除等操作。 |
<!-- Sample_05_05的GridDetailsView.aspx页面 -->
<%@ Page Language="C#" %>
<script runat="server">
protected void dvUser_ItemUpdated(object sender,
DetailsViewUpdatedEventArgs e)
{
gvUser.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>实现“主/从”数据操作</title></head>
<body><form id="form1" runat="server">
<asp:GridView ID="gvUser" runat="server" AutoGenerateColumns="False"
BackColor="White" BorderColor="#336666" BorderStyle="Double"
BorderWidth="3px" CellPadding="4" GridLines="Horizontal"
DataKeyNames="ID" DataSourceID="myDSUser" Font-Size="9pt">
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID"
InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="UserName" HeaderText="UserName"
SortExpression="UserName" />
<asp:BoundField DataField="Email" HeaderText="Email"
SortExpression="Email" />
<asp:BoundField DataField="CreateDate" HeaderText="CreateDate"
SortExpression="CreateDate" ReadOnly="True" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="myDSUser" runat="server" ConnectionString="<%$
ConnectionStrings:WEB2ASPNET2DBConnectionString %>"
SelectCommand="SELECT [ID], [UserName], [Email], [CreateDate]
FROM [User]"></asp:SqlDataSource>
<asp:DetailsView ID="dvUser" runat="server" BackColor="White"
BorderColor="#336666" BorderStyle="Double" BorderWidth="3px"
CellPadding="4" GridLines="Horizontal" AutoGenerateRows="False"
DataKeyNames="ID" DataSourceID="myDSSingleUser"
OnItemUpdated="dvUser_ItemUpdated" Font-Size="9pt">
<Fields>
<asp:BoundField DataField="ID" HeaderText="ID"
InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="UserName" HeaderText="UserName"
SortExpression="UserName" />
<asp:BoundField DataField="Email" HeaderText="Email"
SortExpression="Email" />
<asp:BoundField DataField="CreateDate" HeaderText="CreateDate"
SortExpression="CreateDate" />
<asp:CommandField ShowEditButton="True" />
<asp:CommandField ShowDeleteButton="True" />
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="myDSSingleUser" runat="server"
ConnectionString="<%$
ConnectionStrings:WEB2ASPNET2DBConnectionString%>"
SelectCommand="SELECT [ID], [UserName], [Email], [CreateDate]
FROM [User] WHERE ID = @ID"
DeleteCommand="DELETE [User] WHERE ID = @ID"
InsertCommand="INSERT INTO [User](Username,Email,RoleID,CreateDate)
VALUES(@Username,@Email,1,GetDate())"
UpdateCommand="UPDATE [User] SET Username = @Username,
Email = @Email,CreateDate = GetDate() WHERE ID = @ID">
<DeleteParameters><asp:Parameter Name="ID" /></DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="Username" /><asp:Parameter Name="Email" />
<asp:Parameter Name="ID" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="Username" /><asp:Parameter Name="Email" />
</InsertParameters>
<SelectParameters>
<asp:ControlParameter ControlID="gvUser" DefaultValue="-1"
Name="ID" PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>
</form></body>
</html>
上述代码实例执行之后,GridDetailsView.aspx页面如图5.35所示。单击第3行中的【选择】链接,dvUser控件将显示该行数据。此时,单击dvUser控件中的【编辑】链接,如图5.36所示。
图5.35 GridDetailsView.aspx页面的初始界面 图5.36 dvUser控件编辑当前行数据