三十五使用Repeater和DataList单页面实现主从报表

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

在ASP.NET2.0中操作数据之三十五:使用Repeater和DataList单页面实现主/从报表作者:heker2007字体:[增加减小]类型:转载时间:2016-05-10我要评论前面已经介绍了ASP.NET2.0中如何使用两个页面实现主/从报表,本文主要讲解,如何使用一个单独页面实现主/从报表。导言在前面一章里我们学习了如何用两个页分别显示主/从信息。在“主”页里我们用Repeater来显示category。每个category的name都是一个链到“从”页的hyperlink。在从页里用一个两列的DataList显示选中的category下的product。本章我们将还是使用单页,在左边显示category列表,category的名字用LinkButton显示。点击其中一个时页面postback,在右边以两列的DataList显示出相关的product。除了名字外,左边的Repeater还会显示与该category相关联的product总数。(见图1)图1:Category的Name和Product总数显示在左边第一步:在页面左部显示一个Repeater本章我们将在左边显示category,右表显示它关联的product。web页的内容可以使用标准HTML元素或者CSS来定位。到目前为止我们都是使用CSS来定位。在母板页和站点导航一章里我们使用绝对定位来创建导航时,为导航列表和内容之间指定了明确的距离。当然CSS也可以用来对两个元素的位置进行调整。打开DataListRepeaterFiltering文件夹下的CategoriesAndProducts.aspx页,添加一个Repeater和DataList.ID分别设置为Categories和CategoryProducts。然后到源视图里将它们分别放到div元素里。也就是说在Repeater后面加一个闭合的/div,在DataList前加一个开始的div。现在你的代码看起来应该和下面差不多:?12345678divasp:RepeaterID=Categoriesrunat=server/asp:Repeater/divdivasp:DataListID=CategoryProductsrunat=server/asp:DataList/div我们需要使用float属性来将Repeater放到DataList左边,见下面代码:?123456divRepeater/divdivDataList/divfloat:left将第一个div放到第二个的左边。width和padding-right指定了第一个div的宽和div内容和右边框的距离。更多的floating元素信息请参考Floatutorial.我们在Styles.css里创建一个新的CSS类,名为Floatleft(而不是直接在p的样式里设置):?123456.FloatLeft{float:left;width:33%;padding-right:10px;}然后我们用divclass=FloatLeft将divstyle=float:left替换掉。完成以上所讲的内容后,切换到设计视图。你应该看到Repeater已经在DataList左边了(由于还没有配置数据源或模板,这两个控件都是灰的)。图2:调整完位置后的页面第二步:获取每个Category关联的Products总数完成了样式设置后,我们现在来将category数据绑定到Repeater。如图1所示,除了category名字外,我们需要显示和它关联的product总数,为了获取这个信息我们可以:在ASP.NETpage的code-behind里获取这个信息.根据给定的categoryID我们可以通过ProductsBLL类的GetProductsByCategoryID(categoryID)方法来获取关联的product总数。这个方法返回一个ProductsDataTable对象,它的Count属性表示了我们需要知道的信息。我们可以为Repeater创建一个ItemDataBoundeventhandler,在每个category绑定到Repeater时调用这个方法然后将总数输出。在DataSet里更新CategoriesDataTable添加一个NumberOfProducts列.我们可以更新CategoriesDataTable的GetCategories()方法来包含这个信息或者保留这个方法,再创建一个新的名为GetCategoriesAndNumberOfProducts()方法。我们来看看这两种方法。第一种写起来更简单,因为我们不需要更新DAL。但是它需要和数据库更多的连接。在ItemDataBoundeventhandler里调用GetProductsByCategoryID(categoryID)方法又增加了一次数据库连接(这在每个category绑定时会发生一次)。这时一共会有N+1次对数据库的请求(N为Repeater里显示的category的总数)。而第二种方法product总数从GetCategories()(或GetCategoriesAndNumberOfProducts())方法返回,这样只请求一次数据库就可以了。在ItemDataBoundEventHandler里获取Products总数在ItemDataBoundeventhandler里获取product总数不需要修改DAL。只需要直接修改CategoriesAndProducts.aspx页。通过Repeater的智能标签添加一个新的名为CategoriesDataSource的ObjectDataSource。使用CategoriesBLL类的GetCategories()方法配置它。图3:配置ObjectDataSourceRepeater里的每个Category都是可点的,而且在点了之后,CategoryProductsDataList会显示那些相关的product。我们可以将每个category设为hyperlink,链到本页(CategoriesAndProducts.aspx),通过querystring为CategoryID赋值。这种方法的好处是,特定category的product可以通为搜索建立索引和书签。我们也可以将每个category设为LinkButton,在本章我们使用这个方法。LinkButton看起来象一个hyperlink,但是点击后会产生一个postback。DataList的ObjectDataSource会刷新以显示选中category相关联的product。在本章使用hyperlink更合理。然而在别的情况下可以使用LinkButton会好一点。虽然是这样,我们在这里也使用LinkButton。我们将会看到,使用LinkButton会有一些使用hyperlink时碰不到的挑战。因此我们可以学习更好学习它,以便以后使用。注意:如果你使用HyperLink或a来代替LinkButton来重复练习一次本章的内容,是最好不过了。下面的标记语言是Repeater和ObjectDataSource的,注意Repeater的template将每个item表示为LinkButton。?123asp:RepeaterID=Categoriesrunat=serverDataSourceID=CategoriesDataSourceHeaderTemplateul/HeaderTemplateItemTemplate456789101112131415liasp:LinkButtonrunat=serverID=ViewCategory//li/ItemTemplateFooterTemplate/ul/FooterTemplate/asp:Repeaterasp:ObjectDataSourceID=CategoriesDataSourcerunat=serverOldValuesParameterFormatString=original_{0}SelectMethod=GetCategoriesTypeName=CategoriesBLL/asp:ObjectDataSource注意:在本章Repeater的viewstate必须开启(Repeater的声明语法里的EnableViewState=False)。在第三步我们将为ItemCommand事件创建一个eventhandler,在它里面我们要更新DataList的ObjectDataSource的SeleceParameters集合。如果viewstate被禁用的话Repeater的ItemCommand不会被激发。想了解具体的原因和更多的信息请参考AStumperofanASP.NETQuestion和itssolution。ID为ViewCategory的LinkButton还没有设置Text属性。如果我们只需要显示category名字,我们可以通过绑定语法象下面这样来直接设置:?12asp:LinkButtonrunat=serverID=ViewCategoryText='%#Eval(CategoryName)%'/然而在这里我们需要显示的是category的name和proudct的总数。见下面的代码:?1234567protectedvoidCategories_ItemDataBound(objectsender,RepeaterItemEventArgse){//Makesurewe'reworkingwithadataitem...if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem){//ReferencetheCategoriesRowinstanceboundtothisRepeaterItemNorthwind.CategoriesRowcategory=(Northwind.CategoriesRow)((System.Data.DataRowView)e.Item.DataItem).Row;//Determinehowmanyproductsareinthiscategory89101112131415161718192021NorthwindTableAdapters.ProductsTableAdapterproductsAPI=newNorthwindTableAdapters.ProductsTableAdapter();intproductCount=productsAPI.GetProductsByCategoryID(category.CategoryID).Count;//ReferencetheViewCategoryLinkButtonandsetitsTextpropertyLinkButtonViewCategory=(LinkButton)e.Item.FindControl(ViewCategory);ViewCategory.Text=string.Format({0}({1:N0}),category.CategoryName,productCount);}}我们首先要确保我们处理的是dataitem(ItemType为Item或AlternatingItem)然后引用刚刚绑定到当前RepeaterItem的CategoriesRow。然后调用GetCategoriesByProductID(categoryID)方法,通过Count属性获取返回的记录条数。最后将ItemTemplate里的ViewCategoryLinkButto

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功