当前位置:首页>>网络编程>>ASP.net>>正文

Scott Mitchell ASP.NET 2数据控件嵌套

文章出处: 作者:编辑整理 发布时间:2008-06-02 收藏到QQ书签

除了静态HTML和数据绑定语法,template也可以包含Web控件和用户控件.这些控件的属性可以通过声明语法,数据绑定语法或在服务器端通过事件处理编程来设置.

 

通过将控件嵌入到template里,可以自定义界面,提升用户体验.例如,在在GridView控件中使用TemplateField 里,我们学习了如何通过在GridView的TemplateField里加一个Calendar控件来表示员工的雇佣日期.在给编辑和新增界面增加验证控件 和定制数据修改界面 里,我们学习了如何通过添加验证控件, TextBox,DropDownList和其它Web控件来自定义编辑,插入界面.

Template也可以包含其它数据控件.即,我们可以让DataList在Template里包含其它DataList(或者Repeater,GridView,DetailsView等).这个工作的挑战在于将数据绑定到里面的数据控件上.有几种不同的方法可以实现,包括从使用ObjectDataSource的声明语言到直接编程.

在本章里我们将探索如何使用嵌套的Repeater.外层的Repeater将每个category显示为一个item,包含category的name和description.每个category的item里的Repeater显示此category下的每个product(见图1).我们将分别学习如何通过声明和编程的方法创建内层的Repeater.

 

图1: Category和属于它的Product一起被列出

第一步: 创建Category列表

当创建一个使用嵌套数据控件的页时,我发现开始从最外层的控件的设计,创建和测试开始非常的有帮助,这个时候不用管内层嵌套的控件.因此,我们首先实现往页面里添加一个Repeater来列出category的name和description.

打开DataListRepeaterBasics文件夹里的NestedControls.aspx页.添加一个Repeater控件,将ID设为CategoryList..通过它的智能标签,选择创建一个新的名为CategoriesDataSource的ObjectDataSource.

 

图 2: 创建一个名为CategoriesDataSource的ObjectDataSource

用CategoriesBLL类的GetCategories方法配置O
 

图3: 用CategoriesBLL类的GetCategories方法配置ObjectDataSource


我们需要切换到源视图来手动输入声明代码指定Repeater的template内容.增加一个带<h4>的name和<p>的description的ItemTemplate.用<hr>将category分开.在作完这些后,你的页面代码里的Repeater和ObjectDataSource声明语言应该和下面差不多:

ASP.NET
1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            
<asp:Repeater ID="CategoryList" runat="server" DataSourceID="CategoriesDataSource"
            EnableViewState="False">
            <ItemTemplate>
            <h4><%# Eval("CategoryName") %></h4>
            <p><%# Eval("Description") %></p>
            </ItemTemplate>
            <SeparatorTemplate>
            <hr />
            </SeparatorTemplate>
            </asp:Repeater>
            <asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
            OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetCategories" TypeName="CategoriesBLL">
            </asp:ObjectDataSource>
            

下一步我们的任务是在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>
            

 

图 5: 外层的Repeater 列出每个Category; 内层的Repeater 列出属于Category的Products

直接编程来获取Category 下的Products


除了使用ObjectDataSource来获取当前category下的proudct外,我们还可以在ASP.NET页的code-behind里(或App_Code文件夹里或一个单独的类项目里)来创建一个根据传入的CategoryID返回合适的product集的方法.假设在ASP.NET页的code-behind里有一个名为GetProductsInCategory(categoryID)方法.我们可以使用这个方法来将当前category下的product绑定到内层的Repeater.见下面的代码:

ASP.NET
1
            2
            3
            4
            
<asp:Repeater runat="server" ID="ProductsByCategoryList" EnableViewState="False"
            DataSource='<%# GetProductsInCategory(CType(Eval("CategoryID"), Integer)) %>'>
            ...
            </asp:Repeater>
            

Google