ASP.NET 2.0中的操作数据34:基于数据列表和中继器的跨页主/从报告
介绍
在前一章中,我们学习了如何在一个页面上显示主/从信息。另一种常用模式是在两页上分别显示主/从信息。在前面的跨页面主/从报告中,我们使用了这种模式,通过GridView显示所有供应商。GridView包含一个超链接字段,该字段链接到另一个页面。并通过querystring发送供应商ID。第二页列出了GridView选择的供应商提供的产品。
两页主/从表也可以由DataList和Repeater实现。唯一的区别是DataList和Repeater都不提供HyperLinkField。因此,我们需要在ItemTemplate中添加一个超链接控件或使用html a。超链接的NavigateUrl属性和的href属性可以通过声明或编程来定义。
在本章中,我们将讨论使用Repeater来列出类别。每个列表项都包含类别的名称和描述。你可以通过名字直接链接到第二页。在第二页中,所选类别提供的产品由数据列表显示。
第一步:列出了类别。
创建所有主从表的第一步是显示主记录。因此,我们首先在“主”页面显示类别。在DataListRepeaterFiltering文件夹中打开CategoryListMaster.aspx页面,添加一个中继器,然后通过智能标记添加一个ObjectDataSource。使用CategriesBLL类的GetCategories方法进行配置。参见图1。
图1:使用CategoriesBLL类的GetCategories方法配置ObjectDataSource。
我们不在乎如何先添加链接。配置中继器的模板,以显示每个类别的名称和描述。参见下面的代码:
asp: repeater ID=' repeater 1 ' runat=' server ' data sourceid=' objectdata source 1 ' EnableViewState=' False ' header template ul/header template item template Li % # Eval(' category name ')%-% # Eval(' Description ')%/Li/item template FooterTemplate/ul/FooterTemplate/asp: objectdata source ID=' object data source 1 ' runat=' server ' oldvaluesparametformatterstring
图2:列出了所有类别。
在第二步:中,类别名称被转换为链接到详细信息页面的链接。
现在,让我们添加一个链接。当用户单击它时,它将链接到第二个页面(productsForcategorydetails.aspx),其中显示了“发件人”信息。在此页面中,所选类别的产品与数据列表一起显示。为了判断点击了哪个类别链接,我们需要将CategoryID传递到第二页。最直接的方法是传递querystring。我们通过名为CategoryID的querystring字段将此传递给productforcategorydedtails . aspx。例如,要查看饮料类别下的产品,类别号为1。用户将访问productfor categorydedtails . aspx?CategoryID=1页。
为了创建超链接,我们需要在ItemTemplate中添加超链接控件或HTMLa。当每一行中的超链接相同时,这两种方法都足够了。对于中继器,我更喜欢使用a。参见下面的代码:
阿利?CategoryID=% # eval(' CategoryID ')% ' % # eval(' categoryname ')%/a-% # eval(' description ')%/Li注意CategoryID可以通过href属性直接写入。注意引号和省略号。
Li asp: hyperlink runat=' server ' Text=' % # Eval(' CategoryName ')% ' NavigateUrl=' % # ' productforcategorydedails . aspx?cate yid=' eval(' categoryid ')% '/ASP :超链接-%# eval ('description')%/Li注意,在绑定语法中,静态的URL-ProductForCategorydedails . aspx?Categoryid-如何直接连接到Eval的结果(' CategoryID ')。
使用超链接控件的一个好处是如果需要的话可以编程访问中继器的项绑定事件事件处理程序。例如你可以将没有关联产品的种类显示为文本,而不是链接。将那些没有关联产品的种类的超链接的链接属性设为一个空的字符串,这样类别名称就显示为一个文本(而不是链接)。更多的通过项目数据绑定事件处理程序的编程来格式化数据列表和中继器内容的信息请看格式化数据列表和中继器的数据。如果你在跟着教程做的话,使用上面两种方法都可以。当浏览这页时,每个类别名称都以环的形式呈现,可以链接到ProductsForCategoryDetails.aspx页,并将分类编号的值传过去。见图3.
图3:类别名称现在链接到ProductsForCategoryDetails.aspx页
第三步: 列出选中的种类下的制品
完成CategoryListMaster.aspx页后,我们现在来完成'从'页,ProductsForCategoryDetails.aspx .打开这个页,拖一个数据列表控件进来,并将身份设置为产品集成。然后在智能标签里选择添加一个名为产品类别数据源的对象数据源.并用ProductsBLL类的getproductbycategoryid(categoryID)方法配置它。在插入、更新、删除标签里选择没有。
图4: 使用ProductsBLL类的getproductbycategoryid(categoryID)方法配置对象数据源
由于getproductbycategoryid(categoryID)方法接收一个参数,所以向导会提示我们指定参数来源。设置参数源为查询字符串,查询字符串字段为类别1 .
图5: 使用查询字符串字段作为参数来源
象前面教程里看到的那样,完成数据源配置后,Visual Studio会自动创建一个模板列列出每个字段的名字和价值。我们只显示供应商名称和价格。将数据列表的列数属性设为2.完成这些后你的声明标记看起来应该和下面差不多:
asp:目录ID=' productin category ' runat=' server ' DataKeyField=' Productid '重复列=' 2 '数据源ID=' productin integral data source ' EnableViewState=' False '项目模板H5 % # Eval('产品名称')%/H5 p由%# Eval('供应商名称')提供%br/%# Eval('UnitPrice ',' { 03360 c } ')%/p/项目模板/asp3360目录现在我们来看看效果,先浏览CategoryListMater.aspx页。然后在列出的种类上点一个链接。这样就会跳到ProductsForCategoryDetails.aspx页,并将分类编号通过参数传过去。产品类别数据源对象数据源会返回指定种类的产品并将它们显示在数据列表中,每行两个。图6是点击饮料的截图。
图6: 每行两个的显示饮料
第四步: 在ProductsForCategoryDetails.aspx里显示种类信息
当用户在CategoryListMaster.aspx页点击一个种类时,会跳到ProductsForCategoryDetails.aspx页并显示选中的种类下的产品。然而在这个页里并没有包含哪个种类被选中了的信息。用户可能想点饮料,但是结果点了调味品,这时他没办法知道自己是否点错了。为了剞劂这个问题,我们可以将选中的种类信息显示在ProductsForCategoryDetails.aspx页的顶部(姓名和描述)。在ProductsForCategoryDetails.aspx的中继器上添加一个FormView .然后通过智能标签添加一个名为分类数据源的ObjectDataSource,并用类别基地址定位连接类的GetCategoryByCategoryID(categoryID)方法配置它。
图7: 配置分类数据源
在第三步中,添加producticategory data source object data source时,向导提示我们为getCategoryID (categoryid)方法指定输入参数。这里,我们使用与之前相同的配置,参数源设置为QueryString,QueryStringField设置为categoryid(参见图5)。
向导完成后,Visual Studio将自动为窗体视图创建项目模板、编辑项目模板和插入项目模板。由于只提供了只读接口,我们将编辑itemtaperture和InsertItemTemplate。当然,您也可以为FormView定制ItemTemplate。完成上述操作后,您的标记语言应该类似于下面的3360。
asp3360 FormView ID=' FormView1 ' runat=' server ' DataKeyNames=' CategoryID ' data source ID=' categorydata source ' EnableViewState=' False ' Width=' 100% ' item板H3 asp3360标签ID=' CategoryNameLabel ' runat=' server ' Text=' % # Bind(' CategoryName ')% '//H3 p asp3360标签ID=' descriptlabel ' runat=' server ' Text=' % # 1
图8:类别信息显示在页面顶部。
第五步:如果所选类别下没有产品,将显示提示信息。
categorylistmaster.aspx页面将列出所有类别,无论是否有相关产品。如果用户单击了没有产品的类别,则数据源为空。在上一个教程中,我们看到GridView提供了一个EmptyDataText属性,当数据源没有记录时,该属性可以用来定义消息。不幸的是,数据列表和中继器都没有这个属性。
为了在类别没有产品时提示用户,我们需要在页面中添加一个标签控件。如果没有匹配的产品,将其文本属性设置为要显示的信息。我们需要根据DataList中是否有内容,以编程方式设置它的Visible属性。首先,在数据列表下添加一个标签控件。将其标识设置为无产品消息。文本设置为“所选类别没有产品……”。然后,我们根据是否有数据绑定到产品分类数据列表来设置其可见属性。这一步需要在数据绑定到DataList之后进行。对于GridView,对于DetailsView和FormView,我们可以为DataBound事件创建一个事件处理程序,该事件将在数据绑定后激发。但是,数据列表和中继器都没有数据绑定事件。
在这个例子中,我们可以在Page_Load事件处理中设置Label的Visible属性。但是,因为数据绑定到DataList先于Page的Load事件,所以在正常情况下,该方法将不起作用。因为来自ObjectDataSource的数据在页面周期后绑定到DataList,所以如果显示的数据基于另一个控件的值,例如,在使用DropDownList显示主记录的主/从表的示例中,数据将不会绑定到控件,直到页面生命周期的PreRender。
在所有情况下都有效的解决方案是在数据列表的项目数据绑定(或项目创建)事件处理中将可见设置为假。在这种情况下,我们知道数据源中至少有一个数据项,因此我们可以隐藏NoProductsMessage标签。除了这个事件处理程序,我们还需要一个数据列表数据绑定的事件处理程序来初始化标签的可见属性为真。由于数据绑定时间是在项目数据绑定事件之后触发的,因此标签的可见属性将被初始化为真。如果有数据,将设置为假。参见下面的代码:
受保护的void products in integrary _ data binding(对象发送方,事件参数e){ //显示标签protected消息。可见=真;}受保护的void product in integrary _ itemdarbond(对象发送方,datalistiteventargs e){//如果我们有数据项,则隐藏Label If(e . item . item type==ListItemType。item | | e . item . item type==ListItemType。alternating item)no products message。可见=假;} north wind数据库中的类别都与一个或多个产品相关联。为了测试上述功能,我手动修改了Northwind数据库,product类别(CategoryID=7)中的所有产品都与海鲜类别(CategoryID=8)相关联。您可以在服务器资源管理器中选择“新建查询”,并使用以下语句3360。
更新产品设置categoryid=8,其中categoryid=7更新数据库后,请返回CategoryListMaster.aspx页面并单击product链接。由于“生产”类别下没有产品,您将看到“所选类别没有产品……”的提示,如图9所示。
图9:当所选类别下没有产品时,将显示提示信息。
摘要
主/从记录可以分别显示在一页或两页上。在本章中,我们学习了如何使用Repeater在“主”页面上列出类别,在“从”页面上列出相关产品。“主”页面上的每个项目都包含一个指向“从”页面的链接,该行的CategoryID值被传递。
在“from”页面中,产品由ProductsBLL类的product.categoryID (CategoryID)方法返回。categoryid参数由querystring的categoryid值指定。此外,我们还使用FormView在‘from’页面显示类别的详细信息,当所选类别与产品不关联时,会显示提示消息。
编程快乐!
作者简介
斯科特米切尔,六本关于ASP/ASP的书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。Scott是一名独立的技术顾问、培训师和作家,最近完成了一部即将由Sams出版社出版的新作,24小时内精通ASP.NET 2.0。他的联系电子邮件是[emailprotected],也可以通过他的博客http://ScottOnWriting.NET联系到他。
版权声明:ASP.NET 2.0中的操作数据34:基于数据列表和中继器的跨页主/从报告是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。