0

私は問題で立ち往生しています。私はおそらく解決策に近いと思いますが、そこに到達できないようです。ストアドプロシージャからデータセットにロードされる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>

この情報を表示するには、ネストされたリピーターを使用する必要があります。私が欲しいのは、それを「グループ」ノードでグループ化し、その「グループ」ノードに属する各「データノード」を表示することです。したがって、ページでは次のようになります。

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

各データノードを次々に表示するように設定することはできますが、リピーターをネストしてグループ化する方法がわかりません。私はXPathとリピーターに慣れていないので、知識に多少のギャップがあり、点をつなぐことができないと思います(完全に間違った道を走っていない限り)。

ありがとう

4

1 に答える 1

4

OKなので、さらに実験した後、私の解決策を見つけました:

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

これが将来他の誰かに役立つことを願っています(または私が再び忘れたときに)。

于 2009-11-17T12:22:42.063 に答える