2009-11-14 5 views
0

Я застрял в проблеме. Я думаю, что я, вероятно, близок к решению, но, похоже, не могу туда попасть. У меня есть XMLDoc, который загружается из сохраненного Proc, в набор данных, и xml извлекается из него (не думаю, что я могу изменить любую из этой части). XML выглядит так:Вложенный репитер с использованием XMLNodeList

<data> 
    <datanode> 
    <name>11</name> 
    <group>G1</group> 
    <value>val1</value> 
    </datanode> 
    <datanode> 
    <name>12</name> 
    <group>G1</group> 
    <value>val2</value> 
    </datanode> 
    <datanode> 
<name>21</name> 
<group>G2</group> 
<value>val1</value> 
    </datanode> 
    <datanode> 
<name>22</name> 
<group>G2</group> 
<value>val2</value> 
    </datanode> 
    <datanode> 
<name>23</name> 
<group>G2</group> 
<value>val3</value> 
    </datanode> 
    <datanode> 
<name>31</name> 
<group>G3</group> 
<value>val1</value> 
    </datanode> 
    <datanode> 
<name>32</name> 
<group>G3</group> 
<value>val2</value> 
    </datanode> 
    <datanode> 
<name>33</name> 
<group>G3</group> 
<value>val3</value> 
    </datanode> 
    <datanode> 
<name>34</name> 
<group>G3</group> 
<value>val4</value> 
    </datanode> 
</data> 

Мне нужно использовать вложенные ретрансляторы для отображения этой информации. Я хочу сгруппировать его узлом «group», а затем показать каждый из «datanodes», принадлежащих этому «групповому» узлу. Так это будет выглядеть примерно так на странице:

G1 - has 2 nodes 
11 - Val1 
12 - Val2 

G2 - has 3 nodes 
21 - Val1 
22 - Val2 
23 - Val3 

etc 

То, что я до сих пор: Default.aspx:

<asp:Repeater ID="Repeater1" runat="server"> 

    <ItemTemplate> 
     <p>     
      COUNT: <asp:Literal runat="server" ID="Literal3" Text='<%# XPath("count(group)") %>' />     
      <br />Text: <asp:Literal runat="server" ID="Literal4" Text='<%# XPath("text()") %>' /> 
      <br />Group: <asp:Literal runat="server" ID="Literal2" Text='<%# XPath("group") %>' /> 
      <br />ID: <asp:Literal runat="server" ID="displayname" Text='<%# XPath("name") %>' /> 
      <br />VAL: <asp:Literal runat="server" ID="Literal1" Text='<%# XPath("value") %>' /> 
     </p>    

    </ItemTemplate> 

    </asp:Repeater> 

Default.aspx.cs

public partial class _Default : System.Web.UI.Page 
{ 
    private XmlNodeList nodelist; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(@"C:\development\testforWork\WebApplication1\WebApplication1\data.xml"); 

     nodelist = doc.SelectNodes("//datanode[not(group=preceding-sibling::datanode/group)]/group");   
     //nodelist = doc.SelectNodes("//datanode[group='G2']"); 

     Repeater1.DataSource = nodelist; 
     Repeater1.DataBind(); 
    } 
} 

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

Благодаря

ответ

4

ИТАК нашли мое решение после того, как несколько больше экспериментирует:

<asp:Repeater ID="repManifestNumber" runat="server" DataSource="<%# ManifestDataTemp %>"> 
        <ItemTemplate> 
          Manifest Number: 
          <%# CurrentManifestNumber = XPath("manifest_number").ToString() %>         
          - <%# XPath("count(..//box_item[manifest_number=" + CurrentManifestNumber + "])")%> Box(s) 

         <div class="showhide"> 
           <asp:Repeater ID="repMainfestDetail" runat="server" DataSource='<%# ((XmlNode)Container.DataItem).SelectNodes("..//box_item[manifest_number=" + CurrentManifestNumber + "]") %>'> 
            <HeaderTemplate> 
             <table class="orders" id="manifest_<%# CurrentManifestNumber %>"> 
              <tr> 
               <th> 
                Box Number 
               </th> 
               <th> 
                Date Dispatched 
               </th> 
               <th> 
                <input type="checkbox" class="checkboxflipflop_local" /> 
                - Select All 
               </th> 
              </tr> 
              <asp:PlaceHolder ID="itemPlaceholder" runat="server" /> 
            </HeaderTemplate> 
            <ItemTemplate> 
             <tr class="odd-table-row"> 
              <td> 
               <asp:Literal runat="server" ID="litBoxNumber" Text='<%# XPath("box_number") %>' /> 
              </td> 
              <td> 
               <asp:Literal runat="server" ID="litErpDispatched" Text='<%# Convert.ToDateTime(XPath("date_dispatched")).ToString("dd/MM/yyyy") %>' /> 
              </td> 
              <td> 
               <asp:Literal runat="server" ID="litHiddenXmlNode" Text='<%# ((XmlNode)Container.DataItem).OuterXml %>' 
                Visible="false"></asp:Literal> 
               <asp:CheckBox ID="chkIsReceived" runat="server" Checked="false" CssClass="storecheckbox" /> 
              </td> 
             </tr> 
            </ItemTemplate> 

           </asp:Repeater>         
         </table> 
         </div> 
        </ItemTemplate> 

       </asp:Repeater> 

Надеется, что это может помочь кому-то еще в будущем (или меня, когда я забыл его снова).

+0

, который работает найти со мной –

+0

строка: может быть проще: