2012-04-30 41 views
0

我有三個表如下:表1稱爲Cat1,表2稱爲subcat1和表三稱爲itemsTb。我創建的關係是這樣的:3嵌套中繼器與Sql表

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中繼器顯示它們?或者我必須以不同的方式構建我的表格才能使其工作?非常感謝你的幫助。

+0

這裏以前問:http://stackoverflow.com /問題/ 8454129 /高效的雙向結合嵌套中繼器-3的水平深。我應該回頭看看。對不起,投票結束重複。 – David

+0

還有工作代碼在這個答案以及:http://stackoverflow.com/questions/5159736/asp-net-3-level-of-nested-repeater – David

回答

2

所有ASP.NET數據綁定控件(直放站,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來處理的子類別(這通常會導致另一個嵌套中繼器其項目)。

使用數據集,你可以這樣做(注意,這是粗略的代碼,你需要填寫一些缺少的步驟):

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> 
+0

標記,我有需要立即顯示在rptCategory下的項目,然後有在rptSubCat下顯示的項目。 我如何編寫邏輯來獲得這個? –

+0

@ IH-77 - 您需要提供查詢和/或模式的詳細信息。基本上,你*不會*想要對待他們 - 所以你需要將它們分開。很大程度上取決於您如何獲取數據(SqlDataSource?自定義對象?EF?) –

+0

我已經使用了與David在上面提到的文章中描述的相同的內容:http://support.microsoft.com/KB/306154。 爲我的表的模式,請看看我上面的第一個問題。 –

2

Microsoft爲此提供了指導。 http://support.microsoft.com/kb/306154

(對不起,這不是不再但這是相當直接和興田的文章介紹到它。)

+0

非常感謝大衛爲您的快速回復。我看過那篇文章,但我仍然不知道如何解決我的上述問題。本文只顯示兩個層次的數據層次。 –

+0

添加第三個級別與添加第二個級別完全相同。定義關係,第三級的aspx語法與第二級的aspx語法相同。 – David

+0

這個答案也有工作代碼:http:// stackoverflow。COM /問題/ 5159736/ASP-網3級的嵌套中繼器 – David