DetailsView控件
如其名所示,就是为了显示记录的详细信息,在同一时刻只显示一条记录。作为数据绑定控件,DetailsView也能绑定到SqlDataSource数据源,绑定后代码:
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="id" DataSourceID="SqlDataSource1">
<Fields>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
ReadOnly="True" SortExpression="id" />
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
</Fields>
</asp:DetailsView>
可以看出与GridView不同的是<Fields>,在GridView里面是<Columns>。默认字段类型也是
BoundField类型,当然也可以将BoundField类型转换为TemplateField类型,也可以直接添加
TemplateField类型。然后通过编辑模板列来编辑,这些都是和GridView相同的。除了常见的给
DetailsView启用增删改以外,也可以给其启用分页功能,这将时其可以在各个记录间来回切换,但该
方法效率很低,将导致所有记录都下载到客户端,而换页时又将导致所有记录PostBack,可以使用缓
存特性来缓存DetailsView中的数据。另外DetailsView(从)也可以联合GridView(主)来实现主从表
的效果:这在讲GridView时讲解过,主要是一张表(从)的某个字段在另一张表(主)里是
DataKeyNames(呵呵,这是在GridView里的说法,反映到表里就是主键),这样一般来说选中GridView(
主)里的一行(当然要开启选择功能),就有一些DetailsView(从)的记录符合条件。所以设置时要在
从的配置数据源里的where子句来过滤(看GridView时的讲解),而怎么才能获得选择的主的主键值呢
,就是GridView.SelectedValue,这个值就是选择的那行的主键(DataKeyNames)值。
要隐藏任何一个字段,只要在编辑列里将Visible设置为false就可以了。要合并两个字段,先在编辑
列里将这俩字段删除,再添加一个模板列,再在编辑模板列里设置它的自定义绑定,用Eval或Bind绑
定这俩字段,这里就是绑定字符串可以写自己想要显示的字符串加绑定。别忘了对于任何数据绑定
控件最好指定其DataKeyNames。
在DetailsView显示的记录里增加图片的显示,这里在数据库里存储的是图片的路径,而不是用存储
图片的二进制流的那种方式。1.在添加字段里选ImageField类型的字段,这时会让你选绑定到的字
段(就你的图片字段),及Url格式字符串(它给的例子是images/img{0}.jpg),等你绑定后你后看到其
代码是这样写的DataImageUrlField="picsrc" DataImageUrlFormatString="images/img{0}.jpg"
意思是绑定字段是picsrc,图片显示路径是images/img{picsrc}.jpg,这要看你的数据库里是怎么样
记录的picsrc,我在这里只记录的是图片名如:1.jpg,如果你照着例子写Url格式字符串,最终图片显
示格式将是images/img{1.jpg}.jpg,这显然是不对的,所以要写成images/{0}。但要知道这时你只
能显示图片,不能进行更改添加什么的。所以你要在编辑字段里将该ImageField转换为
TemplateField,则其ItemTemplate会是
<ItemTemplate>
<asp:Image ID="Image1" runat="server"
ImageUrl='<%# Eval("picsrc", "images/{0}") %>' />
</ItemTemplate>
而通过观察其EditItemTemplate和InsertItemTemplate我们可以看出其默认的修改控件也是
TexBox,这显然不是我们想要的,于是我们可以把其改成UploadFile控件来上传我们的图片,但
UploadFile控件只有两个布尔值的属性能与数据库字段双向绑定,我们怎么来更新我们所选择的图
片呢,可以加一个label控件来将UploadFile里的图片名记录到label.text里来,然后更新时修改
label的text属性所绑定的字段(就是图片名字段,这里不需要完整的虚拟路径,从images/{0}中可以
看出)。而像UploadFile的文件上传要在DetailsView1_ItemUpdating(更新数据之前)事件里完成,
至于获得UploadFile文件的名称,很遗憾,我试过好多方法,在DetailsView1_ItemUpdating里都无法
让label获得到UploadFile文件的名称,这就造成了更新时依然是绑定到的图片名(所以就等以没更
新),而插入式更是插入空值。所以就在编辑模板里有加入了Button,让label获得到UploadFile文件
的名称在button的单击事件里进行,虽然成功了,但觉得很麻烦。
DetealsView具有很多与GridView类似的事件,如果熟悉了GridView,则会相当熟悉这些事件的使用。
DetealsView有一个DefaultMode属性,用来设置DetealsView的默认显示模式:Edit(编辑模式)Insert(新建模
式)ReadOnly(只读模式)。
DetealsView有一个ChangeMode方法来改变他的模式,如DetealsView1.ChangeMode(DetailsViewMode.Edit)。
FormView控件
与DeteasView控件的区别就是FormView控件完全是基于模板,开发人员完全可以在编辑模板里任意
设计自己想要的编辑模式插入模式等。所以也很容易在这里为其添加验证控件,而DeteasView控件的BoundField
则没这么容易添加验证控件。其他所有事件几乎相同。