欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表

程序员文章站 2023-12-13 20:53:40
导言   在前面的使用dropdownlist过滤的主/从报表一章里我们使用gridview创建的主/从表,显示一些"主"记录.用户可以根据主记录来查看"从"(详细)的内...

导言

  在前面的使用dropdownlist过滤的主/从报表一章里我们使用gridview创建的主/从表,显示一些"主"记录.用户可以根据主记录来查看"从"(详细)的内容.主/从表在呈现一对多关系和含多列的表的信息时是一个好的选择.在前面我们已经学过如何使用gridview和detailsview来实现.本章和后面两章我们将重新复习一下这些概念,但是主要学习使用datalist和repeater来实现.本章我们将学习使用dropdownlist包含主记录,而在datalist里显示从记录.

第一步: 增加主/从教程页

首先增加本教程会用到的文件夹(datalistrepeaterfiltering)和页.新建页的时候记得选择site.master.

default.aspx
filterbydropdownlist.aspx
categorylistmaster.aspx
productsforcategorydetails.aspx
categoriesandproducts.aspx

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 1: 创建datalistrepeaterfiltering文件夹和页

然后打开default.aspx页,将sectionleveltutoriallisting.ascx用户控件拖进来.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图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>

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 3: 更新之后的site map

第二步: 在dropdownlist里显示categories

  我们的主/从表将在dropdownlist里列出categories ,然后将选择的item的product用datalist显示出来.打开datalistrepeaterfiltering文件夹里的filterbydropdownlist.aspx页,拖一个dropdownlist进来.将dropdownlist的id设为categories.在智能标签上选择选择数据源,创建一个名为categoriesdatasource的objectdatasource

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 4: 添加一个名为categoriesdatasource的 objectdatasource

  使用categoriesbll类的getcategories()方法配置objectdatasource.然后为dropdownlist的text和value配置字段(分别为categoryname和categoryid).

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 5: 配置dropdownlist的text和value

现在dropdownlist里已经列出了categories表里记录.见图6.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 6: 完成后的dropdownlist

第三步: 添加products datalist

  下面将选择的category关联的product列出来.添加一个datalist,创建一个名为productsbycategorydatasource的objectdatasource.用productsbll类的getproductsbycategoryid(categoryid)来配置它.因为我们的报表是只读的,所以在insert,update和delete标签里选择none.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 7: 选择getproductsbycategoryid(categoryid)方法

点下一步,向导会提示我们为categoryid参数选择source.将parameter source设为control,controlid设为categories.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 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.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 9: 第一次访问时, 显示beverage的 products

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 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的项.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 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.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 12: set the appenddatabounditems property to true

  我们将“-- choose a category --” 的value设为0是因为系统里没有categories的value为0,因此当选择这条category时不会有product返回.浏览一下网页来确认这点.见图13.

在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
图 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与他联系。

上一篇:

下一篇: