Отображение частично иерархических данных с вложенными повторителями - PullRequest
1 голос
/ 14 октября 2010

Я ТАК близко, но пока.У меня есть две таблицы, одна для подробностей публикации, другая для списка смежности категорий.

Я пытаюсь отобразить полный набор данных с вложенными повторителями (если нет лучшего способа), и я строюмой DataSet, как показано:

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>

Я вложил такие повторители, потому что некоторые категории не имеют дочерних категорий,но по-прежнему есть публикации.

Итак, у меня есть «Отношения», чтобы получить любые категории «Дети», а затем получить любые публикации, относящиеся к этой категории.Я получаю список категорий со своими детьми и любые публикации, относящиеся к этой категории.

Проблема в том, что я не могу понять, как предотвратить, чтобы некоторые категории детей рассматривались как родители.Есть некоторые категории, у которых нет родителей, но есть публикации.Эти категории будут правильно отображаться под своим родителем, а затем СНОВА как их собственная родительская категория

Как настроить таблицы или отношения, чтобы дочерние категории не рассматривались как родители?

1 Ответ

2 голосов
/ 14 октября 2010

Сначала вам нужно создать DataView с RowFilter либо «parent_id is null», либо parent_id = '', в зависимости от того, какие данные

Затем свяжите это представление данных вместо таблицы.

например.

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

categoryRepeater.DataSource = dv;

Вам не нужно прикасаться к вашей функции GetChildRelation, поскольку она все равно получит DataRowView из Container.DataItem

...