2009-11-14 66 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> 

我需要使用嵌套中繼器來顯示此信息。我想要的是按「組」節點對其進行分組,然後顯示屬於該「組」節點的每個「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

作品找我 – 2017-09-20 05:11:32

+0

行: 可以更容易: 2017-09-20 06:04:49