Scott Mitchell ASP.NET 2数据控件嵌套(3)_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:ASP.Net中无刷新执行Session身份验证
在写一个客户的B/S结构应用程序时,突然发现一个技巧,不知道是否是MS的一个BUG,给相关的有研究的朋友原先考虑写一个检查Session的类,Session失效后,必须转向登陆页面,可每一个调用该类的页


下一步我们的任务是在CategoryList的ItemTemplate里添加一个Repeater用来显示属于各个category下的product.有很多方法可以存取内层的Repeater数据,我们将探讨两种现在我们在CategoryList Repeater的ItemTemplate里创建product Repeater.每个product里将包含name和price

我们将下面的标记加到CategoryList的ItemTemplate里:

ASP.NET
1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            
<asp:Repeater runat="server" ID="ProductsByCategoryList" EnableViewState="False">

            <HeaderTemplate>

            <ul>

            </HeaderTemplate>

            <ItemTemplate>

            <li><strong><%# Eval("ProductName") %></strong>

            (<%# Eval("UnitPrice", "{0:C}") %>)</li>

            </ItemTemplate>

            <FooterTemplate>

            </ul>

            </FooterTemplate>

            </asp:Repeater>

            

第三步: 将各Category下的Product绑定到 ProductsByCategoryList Repeater

如果现在你浏览这个页,你会看到象图4一样的页面,因为我们还没有在Repeater里绑定任何数据.有几种方法可以将合适的product记录绑定到Repeater里,其中一些会比较有效.现在主要的任务是为指定category取到合适的product.

可以通过在ItemTemplate里语法声明ObjectDataSource或者直接在后台代码编程来将数据绑定到内层的Repeater.

通过ObjectDataSource和ItemDataBound来获取数据

这里我们还是用ObjectDataSource来实现.ProductsBLL类的GetProductsByCategoryID(Category)
方法可以返回特定CategoryID的products信息.因此,我们将在CategoryList Repeater的ItemTemplate里新建一个ObjectDataSource,并用这个方法配置它.

不幸的,Repeater不允许通过设计视图来修改template,因此我们需要手动添加将声明语法.见下面的代码:

ASP.NET
1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            
<h4><%# Eval("CategoryName") %></h4>

            <p><%# Eval("Description") %></p>

            <asp:Repeater runat="server" ID="ProductsByCategoryList" EnableViewState="False"

            DataSourceID="ProductsByCategoryDataSource">

            <HeaderTemplate>

            <ul>

            </HeaderTemplate>

            <ItemTemplate>

            <li><strong><%# Eval("ProductName") %></strong> -

            sold as <%# Eval("QuantityPerUnit") %> at

            <%# Eval("UnitPrice", "{0:C}") %></li>

            </ItemTemplate>

            <FooterTemplate>

            </ul>

            </FooterTemplate>

            </asp:Repeater>

            <asp:ObjectDataSource ID="ProductsByCategoryDataSource" runat="server"

            SelectMethod="GetProductsByCategoryID" TypeName="ProductsBLL">

            <SelectParameters>

            <asp:Parameter Name="CategoryID" Type="Int32" />

            </SelectParameters>

            </asp:ObjectDataSource>

            


当使用ObjectDataSource方法时我们需要设置ProductsByCategoryList Repeater的DataSourceID为ObjectDataSource(ProductsByCategoryDataSource).注意ObjectDataSource有一个<asp:Parameter>来指定传给GetProductsByCategoryID(categoryID)的categoryID.但是我们怎么来指定这个值呢?我们可以设置DefaultValue属性为<asp:Parameter>,见下面的代码:
ASP.NET
1

            
<asp:Parameter Name="CategoryID" Type="Int32" DefaultValue='<%# Eval("CategoryID")' />

            

不幸的,数据绑定语法只能用在有DataBinding事件的控件里.Parameter类没有这样的事件,因此这样使用会出错.


我们需要为CategoryList Repeater的ItemDataBound创建一个事件处理来设置这个值.每个item绑定到Repeater时激发ItemDataBound事件.因此每次外层的Repeater激发这个时间时,我们可以将当前的CaegoryID的值传给ProductsByCategoryDataSource ObjectDataSource的CategoryID参数.

下面的代码是为CategoryList Repeater的ItemDataBound创建一个event handler:

C#
1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            
protected void CategoryList_ItemDataBound(object sender, RepeaterItemEventArgs e)

            {

            if (e.Item.ItemType == ListItemType.AlternatingItem ||

            e.Item.ItemType == ListItemType.Item)

            {

            // Reference the CategoriesRow object being bound to this RepeaterItem

            Northwind.CategoriesRow category =

            (Northwind.CategoriesRow)((System.Data.DataRowView)e.Item.DataItem).Row;

            // Reference the ProductsByCategoryDataSource ObjectDataSource

            ObjectDataSource ProductsByCategoryDataSource =

            (ObjectDataSource)e.Item.FindControl("ProductsByCategoryDataSource");

            // Set the CategoryID Parameter value

            ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =

            category.CategoryID.ToString();

            }

            }

            

这个event handler首先保证我们操作的是data item而不是header,footer或separator item.然后,引用刚刚绑定到当前RepeaterItem的CategoriesRow实例.最后,引用在ItemTemplate里的ObjectDataSource并将当前RepeaterItem的CategoryID传给CategoryID参数.

在这个event handler里,每个RepeaterItem里的ProductsByCategoryList Repeater都绑定到RepeaterItem的category里的product.见图5.

分享:.net教程:ASP.NET GridView的分页功能
要实现GrdView分页的功能。 操作如下: 1、更改GrdView控件的AllowPaging属性为true。 2、更改GrdView控件的PageSize属性为 任意数值(默认为10) 3、更改GrdView控件的PageSetting->Mod

来源:模板无忧//所属分类:.Net教程/更新时间:2008-08-22
相关.Net教程