使用ASP.NET DetailsView显示详细信息

开发 后端
本文介绍了如何在asp.net 2.0中使用DetailsView显示选中产品的详细信息。ASP.NET DetailsView也通过配置ObjectDataSource来实现。

***一个步骤是在DetailsView中显示选中产品的详细信息. 要完成该功能, 添加一个DetailsView到页面上, 设置它的ID属性为ProductDetails, 给它创建一个新的ObjectDataSource. 配置ObjectDataSource使它通过ProductsBLL类的GetProductByProductID(productID)方法填充数据,使用ProductsByCategory DropDownList的已选择项的值作为productID参数的值.

选择使用ProductsBLL类 

ASP.NET DetailsView: 选择使用ProductsBLL类

配置 ObjectDataSource 使用GetProductByProductID(productID)方法 

ASP.NET DetailsView: 配置 ObjectDataSource 使用GetProductByProductID(productID)方法

使用ProductsByCategory DropDownList的值作为productID参数的值 

ASP.NET DetailsView: 使用ProductsByCategory DropDownList的值作为productID参数的值

你可以选择在DetailsView显示的任何有效的字段. 我决定不显示ProductID, SupplierID, 和CategoryID字段并且对其余的字段重新排序及格式化.另外, 我去掉了DetailsView的Height和Width属性设置, 允许DetailsView可以扩展到需要的宽度, 这样比把它限制在指定的大小会更好的显示数据. 下面便是全部的标记性语言(markup)

  1. < asp:DetailsView ID="ProductDetails" runat="server" AutoGenerateRows="False" DataKeyNames="ProductID" 
  2.  
  3. DataSourceID="ObjectDataSource1" EnableViewState="False">  
  4.  
  5. < Fields>  
  6.  
  7. < asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />  
  8.  
  9. < asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" />  
  10.  
  11. < asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" />  
  12.  
  13. < asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />  
  14.  
  15. < asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" 
  16.  
  17. HtmlEncode="False" SortExpression="UnitPrice" />  
  18.  
  19. < asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" SortExpression="Units In Stock" />  
  20.  
  21. < asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" SortExpression="Units On Order" />  
  22.  
  23. < asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" SortExpression="Reorder Level" />  
  24.  
  25. < asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />  
  26.  
  27. < /Fields>  
  28.  
  29. < /asp:DetailsView>  
  30.  

花点时间在浏览器中测试一下MasterDetailsDetails.aspx页面. 乍一看好像一切如预计的那样顺利, 但是却有一个小问题. 当你选择了一个新类别, ProductsByCategory DropDownList会更新显示选中类别的产品, 但是ProductDetails DetailsView还是显示上一个产品的信息. 当选择了一个选中类别的不同的产品时DetailsView应该被更新. 此外,如果你的测试足够彻底, 你将会发现如果你不断的选择新类别(比如在Categories DropDownList中选择Beverages,然后选择Condiments,然后是Confections)每个类别的选择都会使ProductDetails DetailsView被刷新.

为了让这个问题更具体一些, 让我们看一个例子. 当你***次访问该页面时, Beverages类别是选中的并且与之相关的产品在ProductsByCategory DropDownList中列出. Chai是当前选中的产品,他的详细信息显示在ProductDetails DetailsView中, 如图18.

DetailsView显示了选中产品的详细信息 

ASP.NET DetailsView: DetailsView显示了选中产品的详细信息

如果你把类别选项Beverages 改成 Condiments, 便会发生一次回发, ProductsByCategory DropDownList会相应的更新, 但是DetailsView仍然会显示Chai的详细信息.

图19:上一次选择产品的详细信息仍然在显示 

ASP.NET DetailsView:上一次选择产品的详细信息仍然在显示

在列表中选择一个产品会如预期地一样刷新DetailsView, 如果你改变了产品之后选择了一个新的类别, DetailsView又一次没有刷新. 然后如果你选择一个新类别而不是选择一个产品, DetailsView则会刷新. 究竟是怎么回事呢?

这个问题是由页面生命周期的时间调度引发的. 当页面被请求时会经过一系列的处理后呈现出来. 这其中的一项处理便是ObjectDataSource控件检查他的SelectParameters值是否发生变化. 如果发生了变化, WEB控件绑定到ObjectDataSource的数据便会刷新显示. 比如, 当一个新类别被选中时, ProductsByCategoryDataSource ObjectDataSource发现它的参数值已经发生了变化,然后ProductsByCategory DropDownList就会重新绑定,获取所选中类别的产品.

在这种情况下发生的该问题是由于在页面的生命周期中ObjectDataSources检查参数是否发生改变的动作是在关联的WEB控件重新绑定之前. 因此,当选择了一个新的类别ProductsByCategoryDataSource ObjectDataSource会检查到它的参数值发生了变化. 但是, ProductDetails DetailsView使用的ObjectDataSource并没有发生任何变化,因为ProductsByCategory DropDownList还没有重新绑定. 在稍后的生命周期中ProductsByCategory DropDownList重新绑定到它的ObjectDataSource,获取刚刚选中类别的产品. 当ProductsByCategory DropDownList的值发生变化的时候ProductDetails DetailsView的 ObjectDataSource已经完成了它的参数值检查工作. 因此, DetailsView还是显示先前的数据. 图20描述了这个交互的过程.

T ProductDetails DetailsView的 ObjectDataSource的检查工作结束后ProductsByCategory DropDownList的值才改变. 

ASP.NET DetailsView: T ProductDetails DetailsView的 ObjectDataSource的检查工作结束后ProductsByCategory DropDownList的值才改变.

要解决这个问题,我们需要在ProductsByCategory DropDownList绑定后显式的重新绑定ProductDetails DetailsView. 我们可以在ProductsByCategory DropDownList的DataBound事件中调用ProductDetails DetailsView的DataBind()方法. 把下面的事件处理代码添加到MasterDetailsDetails.aspx页面的代码后置类:

  1. protected void ProductsByCategory_DataBound(object sender, EventArgs e)  
  2.  
  3. {  
  4.  
  5. ProductDetails.DataBind();  
  6.  
  7. }  
  8.  

添加对ProductDetails DetailsView的DataBind()方法的显式调用后,就一切正常了. 图21高亮显示了该方法是如何解决这个问题的.

在ProductsByCategory DropDownList的DataBound事件中ProductDetails DetailsView被显示的刷新. 

ASP.NET DetailsView:在ProductsByCategory DropDownList的DataBound事件中ProductDetails DetailsView被显示的刷新.

DropDownList控件是一个非常理想的用于主/从报表(主记录和从记录存在一对多关系)的用户接口元素(user interface element ). 在前面的教程中我们看到了如何使用单个DropDownList对选中的类别进行产品过滤. 在本教程中我们使用GridView代替了DropDownList做为产品列表, 使用DetailsView显示选中产品的详细信息. 本教程所讨论的概念可以很容易的扩展到包含多个一对多关系的数据模型, 比如客户,订单及订单项. 通常,在一对多的关系中你总是可以使用DropDownList 来表示"主"实体(一对多中的一,主/从关系的主记录)

【编辑推荐】

  1. ASP.NET 2.0数据教程:给站点添加aspx页面
  2. ASP.NET 2.0数据教程:创建母版页
  3. ASP.NET跨页面传值的技巧
  4. ASP.NET 2.0数据教程:给DAL添加定制编码
  5. ASP.NET 2.0数据教程:完成数据访问层

责任编辑:book05 来源: 博客堂
相关推荐

2009-07-27 16:31:19

ASP.NET Det

2009-07-27 16:46:07

DetailsView

2009-07-27 16:53:15

ASP.NET 2.0

2009-08-03 17:35:07

ASP.NET WebASP.NET编程工具

2009-12-11 14:57:56

ASP.NET

2009-08-04 13:27:27

ASP.NET数据集

2012-04-06 13:52:58

ASP.NET

2009-07-28 03:42:00

ASP.NET Gri

2009-12-18 16:51:41

ASP.NET概述

2012-03-31 10:59:02

ASP.NET

2010-06-28 09:04:55

ASP.NET MVC

2009-07-23 14:08:58

2009-10-30 14:03:59

ASP.NET上传文件

2009-08-03 10:07:20

ASP.NET Ses

2009-08-10 14:55:43

ASP.NET htt

2009-07-23 15:44:39

ASP.NET MVC

2009-07-27 09:45:14

ASP.NET Dro

2009-07-22 17:45:35

ASP.NET教程

2009-07-28 17:17:19

ASP.NET概述

2009-08-03 14:22:33

什么是ASP.NET
点赞
收藏

51CTO技术栈公众号