在前面的两篇教程中,我们看到了如何在单一页面中显示主/从报表, 它使用DropDownList显示主记录,使用GridView或DetailsView显示详细信息. 另外一种常见的主/从报表模式是在一个页面中显示主记录而在另一个页面中显示详细信息.互联网上的论坛,如 ,就是该模式在实际应用中非常典型例子. Asp.Net论坛由多个子论坛组成: Getting Started, Web Forms, Data Presentation Controls 等等. 每个子论坛包含多个主题, 每个主题又由多个贴子组成. 在asp.net论坛主页上列出了这些子论坛,单击其中一个论坛会转到ShowForum.aspx页面, 该页面列出了这个子论坛所包含的主题. 同样,单击一个主题会转向ShowPost.aspx, 该页面显示所单击主题的贴子.
在这篇教程中,我们将通过使用GridView列出供应商来实现该模式. GridView中的每行(一行便是一个供应商)包含一个”查看产品”的链接. 该链接在单击时会转到另外一个页面, 这个页面显示选中供应商的所有产品.
Step 1: 在Filtering文件夹下添加 SupplierListMaster.aspx 和ProductsForSupplierDetails.aspx
在第三篇教程中定义页面结构时我们在BasicReporting, Filtering, 和 CustomFormatting文件夹中增加了好几个起始页面.我们还没有为这篇教程中添加起始页,在Filtering文件夹中增加两个页面: SupplierListMaster.aspx 和 ProductsForSupplierDetails.aspx. SupplierListMaster.aspx将会列出主记录(供应商) ProductsForSupplierDetails.aspx将会显示选中供应商的产品.
在创建这两个页面时注意要让它们关联Site.master母版页.
图1: 在Filtering文件夹下添加 SupplierListMaster.aspx 和ProductsForSupplierDetails.aspx
此外, 添加了两个文件到该项目后, 要确保相应地更新站点地图文件Web.sitemap. 对于该篇教程只要简单地使用下面的XML内容做为元素的子节点
提示:使用K. Scott Allen的免费的Visual Studio Site Map Macro可以帮助你在新增ASP.NET页时自动地更新站点地图.
Step 2: SupplierListMaster.aspx中显示供应商列表
添加SupplierListMaster.aspx 和 ProductsForSupplierDetails.aspx后,接下来就是要在SupplierListMaster.aspx页面上创建一个显示供应商的GridView. 添加一个GridView到页面上并绑定到一个新的ObjectDataSource, 这个ObjectDataSource应该使用SuppliersBLL类的GetSuppliers()方法返回所有供应商.
图2: 选择 SuppliersBLL 类
图3: 配置ObjectDataSource 使用GetSuppliers() 方法
我们需要在每个GridView行中包含一个”查看产品”链接,单击时该链接会转到ProductsForSupplierDetails.aspx页面, 并在查询字符串(querystring)传递选定行的SupplierID值.比如如果用户单击了供应商Tokyo Traders(SupplierID值为4)的”查看产品”链接,将会转到ProductsForSupplierDetails.aspx?SupplierID=4.
要实现该功能, 给GridView添加一个HyperLinkField列, 它会为每个GridView行增加一个链接. 首先在GridView智能标记上单击编辑列链接. 然后在左上角的列表中选择HyperLinkField并单击新增把HyperLinkField添加到GridView的字段列表中.
图4: 添加 HyperLinkField 到GridView
HyperLinkField可以被配置为在每一个GridView行中使用相同的文本或URL值,或是让这些值基于绑定到特定行的数据值. 要指定一个所有行都一样的静态值使用HyperLinkField的Text或NavigateUrl属性. 因为我们想让每一行的链接文本一致,设置HyperLinkField的Text属性为”查看产品”.
图5: 设置HyperLinkField的Text属性为”查看产品”
要让text 或URL基于绑定到GridView行的底层数据, 可能通过DataTextField 或 DataNavigateUrlFields指定Text或URL要从中获取数据的数据字段. DataTextField只能设置为一个单一的数据字段; DataNavigateUrlFields可以设置为一个以逗号分隔的数据字段列表. 我们需要让TEXT或URL基于当前行的数据字段值和一些标记. 比如在这篇教程中,我们希望 HyperLinkField的链接URL是ProductsForSupplierDetails.aspx?SupplierID=supplierID. 其中supplierID是GridView的每个行的supplierID值. 注意我们需要静态值和数据驱动值. ProductsForSupplierDetails.aspx?SupplierID=这部分是静态值.而supplierID部分便是数据驱动的, 它的值是每一行的SupplierID值.