在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
导言
在前面的使用dropdownlist过滤的主/从报表一章里我们使用gridview创建的主/从表,显示一些"主"记录.用户可以根据主记录来查看"从"(详细)的内容.主/从表在呈现一对多关系和含多列的表的信息时是一个好的选择.在前面我们已经学过如何使用gridview和detailsview来实现.本章和后面两章我们将重新复习一下这些概念,但是主要学习使用datalist和repeater来实现.本章我们将学习使用dropdownlist包含主记录,而在datalist里显示从记录.
第一步: 增加主/从教程页
首先增加本教程会用到的文件夹(datalistrepeaterfiltering)和页.新建页的时候记得选择site.master.
default.aspx
filterbydropdownlist.aspx
categorylistmaster.aspx
productsforcategorydetails.aspx
categoriesandproducts.aspx
图 1: 创建datalistrepeaterfiltering文件夹和页
然后打开default.aspx页,将sectionleveltutoriallisting.ascx用户控件拖进来.
图2: 在default.aspx页里增加sectionleveltutoriallisting.ascx
我们需要将主/从教程添加到site map里.打开web.sitemap,将下面的标记添加到“displaying data with the datalist and repeater”节点后:
<sitemapnode title="master/detail reports with the datalist and repeater" description="samples of reports that use the datalist and repeater controls" url="~/datalistrepeaterfiltering/default.aspx"> <sitemapnode title="filter by drop-down list" description="filter results using a drop-down list." url="~/datalistrepeaterfiltering/filterbydropdownlist.aspx" /> <sitemapnode title="master/detail across two pages" description="master records on one page, detail records on another." url="~/datalistrepeaterfiltering/categorylistmaster.aspx" /> <sitemapnode title="maser/detail on one page" description="master records in the left column, details on the right, both on the same page." url="~/datalistrepeaterfiltering/categoriesandproducts.aspx" /> </sitemapnode>
图 3: 更新之后的site map
第二步: 在dropdownlist里显示categories
我们的主/从表将在dropdownlist里列出categories ,然后将选择的item的product用datalist显示出来.打开datalistrepeaterfiltering文件夹里的filterbydropdownlist.aspx页,拖一个dropdownlist进来.将dropdownlist的id设为categories.在智能标签上选择选择数据源,创建一个名为categoriesdatasource的objectdatasource
图 4: 添加一个名为categoriesdatasource的 objectdatasource
使用categoriesbll类的getcategories()方法配置objectdatasource.然后为dropdownlist的text和value配置字段(分别为categoryname和categoryid).
图 5: 配置dropdownlist的text和value
现在dropdownlist里已经列出了categories表里记录.见图6.
图 6: 完成后的dropdownlist
第三步: 添加products datalist
下面将选择的category关联的product列出来.添加一个datalist,创建一个名为productsbycategorydatasource的objectdatasource.用productsbll类的getproductsbycategoryid(categoryid)来配置它.因为我们的报表是只读的,所以在insert,update和delete标签里选择none.
图 7: 选择getproductsbycategoryid(categoryid)方法
点下一步,向导会提示我们为categoryid参数选择source.将parameter source设为control,controlid设为categories.
图 8: 设置categoryid参数为categories dropdownlist
完成上面的配置后,visual studio会为datalist自动生成一个itemtemplate来显示每个字段的name和value.我们来做一些改进,只显示product的name,category,supplier,quantity和price,并在每个item之间加一个<hr>元素(seoaratortemplate).我们将使用datalist和repeater来显示数据 的itemtemplate例子.objectdatasource的标记语言应该和下面差不多:
<asp:datalist id="datalist1" runat="server" datakeyfield="productid" datasourceid="productsbycategorydatasource" enableviewstate="false"> <itemtemplate> <h4> <asp:label id="productnamelabel" runat="server" text='<%# eval("productname") %>' /> </h4> <table border="0"> <tr> <td class="productpropertylabel">category:</td> <td><asp:label id="categorynamelabel" runat="server" text='<%# eval("categoryname") %>' /></td> <td class="productpropertylabel">supplier:</td> <td><asp:label id="suppliernamelabel" runat="server" text='<%# eval("suppliername") %>' /></td> </tr> <tr> <td class="productpropertylabel">qty/unit:</td> <td><asp:label id="quantityperunitlabel" runat="server" text='<%# eval("quantityperunit") %>' /></td> <td class="productpropertylabel">price:</td> <td><asp:label id="unitpricelabel" runat="server" text='<%# eval("unitprice", "{0:c}") %>' /></td> </tr> </table> </itemtemplate> <separatortemplate> <hr /> </separatortemplate> </asp:datalist> <asp:objectdatasource id="productsbycategorydatasource" runat="server" oldvaluesparameterformatstring="original_{0}" selectmethod="getproductsbycategoryid" typename="productsbll"> <selectparameters> <asp:controlparameter controlid="categories" name="categoryid" propertyname="selectedvalue" type="int32" /> </selectparameters> </asp:objectdatasource>
在浏览器里看一下页面.第一次访问时,和beverager关联的product都显示出来了(图9),但是改变dropdownlist不会更新数据,这是因为还更新datalist需要postback.我们将dropdownlist的autopostback属性设为true.
图 9: 第一次访问时, 显示beverage的 products
图 10: 选择一个新的category(produce),更新datalist
添加一个 “-- choose a category --” list item第一次访问页面时,beveages默认被选中,并且在datalist里显示它的product.在使用dropdownlist过滤的主/从报表 里我们添加了“-- choose a category --”选项(默认项),显示所有的product.在gridview里显示product时这样很方便.而对datalist而言,每个product要占很大一块屏幕,因此在选择“-- choose a category --”时底下将不显示product.在dropdownlist的属性里选择items属性,添加一个text为“-- choose a category --”,value为0的项.
图 11: 添加 “-- choose a category --” 项
你也可以直接在dropdownlist的标记语言里添加以下代码:
<asp:dropdownlist id="categories" runat="server" autopostback="true" datasourceid="categoriesdatasource" datatextfield="categoryname" datavaluefield="categoryid" enableviewstate="false"> <asp:listitem value="0">-- choose a category --</asp:listitem> </asp:dropdownlist>
另外我们需要将dropdownlist的appenddatabounditems设为true.因为如果为false(默认),当categories绑定到dropdownlist时将覆盖手工添加的list item.
图 12: set the appenddatabounditems property to true
我们将“-- choose a category --” 的value设为0是因为系统里没有categories的value为0,因此当选择这条category时不会有product返回.浏览一下网页来确认这点.见图13.
图 13: 选中“-- choose a category --” 时, 没有products 被显示
如果你想在选择“-- choose a category --” 时显示所有的product,将它的value设为1.细心的读者会记起来在使用dropdownlist过滤的主/从报表 里我们更新了productsbll类的getproductsbycategoryid(categoryid)方法,如果categoryid为1时所有的product记录会被返回.
总结
当显示层次关系的数据时,使用主/从表来展示数据很有帮助.用户可以通过它从最高层的数据开始,逐渐进入最细节的数据.在本章我们学习了一个简单的主/从表来显示选中的category下的product.我们用dropdownlist列出dategory,datalist来显示product.在下章我们将学习将主/从记录分开到两个页面.在第一个页里,显示所有的"主"记录,并有一个链接到"从"信息的link.点这个link用户会看到显示细节信息的页.
祝编程愉快!
作者简介
scott mitchell,著有六本asp/asp.net方面的书,是4guysfromrolla.com的创始人,自1998年以来一直应用 微软web技术。scott是个独立的技术咨询顾问,培训师,作家,最近完成了将由sams出版社出版的新作,24小时内精通asp.net 2.0。他的联系电邮为,也可以通过他的博客http://scottonwriting.net与他联系。