2010-10-13 49 views
1

我很接近,但到目前为止。 我有两张表,一张用于发布详情,另一张用于类别邻接列表。使用嵌套中继器显示部分分层数据

我想显示完整的数据集嵌套的中继器(除非有一个更好的办法) 和我建立我的数据集,如下所示:

string strSql = "SELECT category_id, parent_id, cat_name_en " + 
       "FROM categories;" + 
       "SELECT pub_id, title_en, category_id " + 
       "FROM publications;"; 

SqlConnection conn = new SqlConnection(connString.ConnectionString); 
SqlDataAdapter da = new SqlDataAdapter(strSql, conn); 

DataSet _ds = new DataSet(); 
da.Fill(_ds); 
_ds.DataSetName = "categories"; 
_ds.Tables[0].TableName = "category"; 
_ds.Tables[1].TableName = "publications"; 

_ds.Relations.Add("ParentChild", 
        _ds.Tables["category"].Columns["category_id"], 
        _ds.Tables["category"].Columns["parent_id"], false); 
_ds.Relations[0].Nested = true; 

_ds.Relations.Add("CategoryMembers", 
        _ds.Tables["category"].Columns["category_id"], 
        _ds.Tables["publications"].Columns["category_id"], false); 
_ds.Relations[1].Nested = true; 


categoryRepeater.DataSource = _ds.Tables["category"]; 
categoryRepeater.DataBind(); 

我显示这样的数据:

<asp:Repeater runat="server" ID="categoryRepeater" EnableViewState="false"> 
    <ItemTemplate> 
    <%# DataBinder.Eval(Container.DataItem, "category_id") %> 
    <%# DataBinder.Eval(Container.DataItem, "cat_name_en") %><br /> 

    <asp:Repeater runat="server" EnableViewState="false" 
     DataSource='<%# GetChildRelation(Container.DataItem, "CategoryMembers") %>'> 
     <ItemTemplate> 
     <p><%# DataBinder.Eval(Container.DataItem, "pub_id") %>&nbsp; 
      <%# DataBinder.Eval(Container.DataItem, "title_en") %></p> 
     </ItemTemplate> 
    </asp:Repeater> 

    <asp:Repeater runat="server" EnableViewState="false" 
     DataSource='<%# GetChildRelation(Container.DataItem, "ParentChild") %>'> 
     <ItemTemplate> 
     <%# DataBinder.Eval(Container.DataItem, "category_id") %> 
     <%# DataBinder.Eval(Container.DataItem, "cat_name_en") %><br /> 
     <asp:Repeater runat="server" EnableViewState="false" 
      DataSource='<%# GetChildRelation(Container.DataItem, "CategoryMembers") %>'> 
      <ItemTemplate> 
      <p><%# DataBinder.Eval(Container.DataItem, "pub_id") %> 
       <%# DataBinder.Eval(Container.DataItem, "title_en") %></p> 
      </ItemTemplate>  
     </asp:Repeater> 
     </ItemTemplate>  
    </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 

我嵌套这样的中继器,因为有些类别没有子类别,但仍然有出版物。

因此,我已经建立了关系以获取任何儿童类别,然后获取属于该类别的任何出版物。 我得到他们的孩子和属于该类别的任何出版物的类别列表。

问题是我无法弄清楚如何防止一些儿童类别被视为父母。有些类别没有父母,但仍有出版物。这些类别将正确显示在他们的父母下,然后再次作为他们自己的父类别

如何配置表或关系,以便孩子类别不像父母那样对待?

+0

这里有嵌套直放站监控好看详细的文章,以显示分层数据 的http://咕。 gl/I37Nuj – 2015-08-19 05:13:57

回答

2

首先,您需要创建任一的RowFilter一个数据视图“PARENT_ID为空”或PARENT_ID =“”这取决于数据是

该数据视图,而不是旁边的桌子绑定。

例如

DataView dv = new DataView(_ds.Tables["category"]); 
dv.RowFilter = "parent_id is null"; 

categoryRepeater.DataSource = dv; 

你不应该碰你GetChildRelation功能,因为它会仍然的Container.DataItem

得到DataRowView的
+0

是的,就是这样。我有一种感觉,它会是这样的小事。非常感谢。 – TomCDona 2010-10-13 20:44:20