3个带有Sql表的嵌套转发器

时间:2012-04-30 18:14:48

标签: asp.net sql-server-2008

我有三个表如下:表1称为Cat1,表2称为subcat1,表3称为itemsTb。我创建了这样的关系:

cat1到subcat1(一对多) cat1到itemstb(一对多) subcat1到itemstb(一对多)

我想在asp.net转发器中显示这样的项目:

cat 1....
   ....item 1
   ....item 2
   ....item 3
cat 2
   subcat 1 .....
      .....item 1
      .....item 2
      .....item 3
cat 3.....
   ....item 1
   ....item 2

etc.

The schema of my tables is like this:

Table: cat
columns:
id      int
title   varchar

table  subcat
columns:
id     int
catid  int
title  varchar

table: items
columns
id         int
catid      int
subcatid   int
title      varchar

任何人都知道如何使用asp.net转发器显示它们?或者我必须以不同的方式构建我的表以使其工作?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

Microsoft提供了相关指导。 http://support.microsoft.com/kb/306154

(对不起,这不是更长,但这是相当简单的,并且在hte文章中很好地介绍了。)

答案 1 :(得分:2)

所有ASP.NET数据绑定控件(Repeater,ListView,GridView等)都可以为其DataSource使用声明性数据绑定。这不是IMO记录的很好,但你可以这样做:

<asp:Repeater ID="rptCategory">
    <ItemTemplate>
        <asp:Repeater ID="rptSubcategory" DataSource='<%#Eval("Subcategories")%>'>
             <ItemTemplate>
                <asp:Repeater ID="rptItems" DataSource='<%#Eval("Items")%>'>
                    <ItemTemplate>
                        <%#Eval("Name")%>
                    </ItemTemplate>
                </asp:Repeater>
             </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

您需要绑定到DataSource属性的细节取决于您的初始数据(rptCategory绑定的数据)。

如果是DataSet,那么您需要构建DataRelations并使用相应DataRelation的名称。

如果它是C#对象,那么您将需要使用集合属性的名称。

编辑:此特定架构的细节如下......

对于您的架构,您需要2个嵌套转发器 - 1个用于处理项目,1个用于处理子类别(对于其项目将具有另一个嵌套转发器)。

使用DataSet,你可以做类似的事情(注意这是粗略的代码,你需要填写一些遗漏的步骤):

var ds = ExecuteDataSet(
   @"SELECT Id, Title FROM Cat;
   SELECT Id, CatId, Title FROM SubCat;
   SELECT Id, CatId, SubCatId, Title FROM Items;"
);
ds.DataRelations.Add("Cat_SubCat", ds.Tables["Cat"].Columns["Id"], ds.Tables["SubCat"].Columns["CatId"]);
ds.DataRelations.Add("Cat_Items", ds.Tables["Cat"].Columns["Id"], ds.Tables["Items"].Columns["CatId"]);
ds.DataRelations.Add("SubCat_Items", ds.Tables["SubCat"].Columns["Id"], ds.Tables["Items"].Columns["SubCatId"]);

this.rptCategory.DataSource = ds;
this.rptCategory.DataBind();

<asp:Repeater ID="rptCategory">
    <ItemTemplate>
        <h2>Category <%#Eval("Title")%></h2>
        <asp:Repeater ID="rptCatItems" DataSource='<%#Eval("Cat_Items")%>'>
            <ItemTemplate>
                <h4>Item (Category) <%#Eval("Title")%></h4>
            </ItemTemplate>
        </asp:Repeater>
        <asp:Repeater ID="rptCatSubCat" DataSource='<%#Eval("Cat_SubCat")%>'>
            <ItemTemplate>
                <h3>SubCategory <%#Eval("Title")%></h3>
                <asp:Repeater ID="rptSubCatItems" DataSource='<%#Eval("SubCat_Items")%>'>
                    <ItemTemplate>
                        <h4>Item (SubCategory) <%#Eval("Title")%></h4>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>