代码之家  ›  专栏  ›  技术社区  ›  Jon

使用xmlnodelist的嵌套中继器

  •  0
  • Jon  · 技术社区  · 15 年前

    我遇到了一个难题。我想我可能已经接近解决方案了,但似乎无法做到。我有一个xmldoc,它从一个存储过程加载到一个数据集中,并从中提取XML(不要认为我可以更改这部分的任何内容)。XML如下所示:

    <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”节点分组,然后显示属于该“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>
    

    Abx.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();
        }
    }
    

    我可以让他们一个接一个地显示每个数据节点,但是我不知道如何嵌套中继器和进行分组。我对xpath和中继器还不太熟悉,我觉得我的知识一定有点空白,只是无法连接这些点(除非我完全走错了路)。

    谢谢

    1 回复  |  直到 13 年前
        1
  •  4
  •   Jon    15 年前

    好吧,在做了更多的试验之后,我找到了我的解决方案:

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

    希望这能在将来帮助别人(或者我再次忘记它的时候)。

    推荐文章