XML数据问题

时间:2011-01-10 11:40:51

标签: asp.net xml

我是XML的新手我已经提供了一个看起来像这样的xml文档

<items>
    <Bookings>
        <Name>Mr Pf_Test_15033</Name>
        <Total>315</Total>
        <Products>
            <Flight>
                <Adults>2</Adults>
            </Flight>
            <Ferry>
                <Adults>2</Adults>
            </Ferry>
        </Products>
    </Bookings>
</items>

我正在尝试使用ASP.Net将我的xml数据绑定到数据网格

到目前为止,我已经有了这个

    Sub Page_Load
Dim dstMenu As DataSet
dstMenu = New DataSet ()
dstMenu.ReadXml(MapPath("getbooking.xml"))
rptItems.DataSource = dstMenu
rptItems.DataBind ()
End Sub

这就是身体

    <asp:DataGrid ID="rptItems" AutoGenerateColumns="true" runat="server">
    </asp:DataGrid>

现在这在某种程度上起作用,我得到的结果只显示了NameTotal列,但我需要它来显示Products的{​​{1}}信息和Flight信息。

我环顾四周,但似乎找不到任何人以这种方式使用XML。

这可能吗?

2 个答案:

答案 0 :(得分:0)

您要求的是多级数据网格。 Here是一篇可能对您有帮助的文章


您是否考虑过使用其他方式显示数据而不是使用分层数据网格?

就像您可以在ListBox中加载预订一样,当用户选择预订时,可以在FormView / DetailsView中显示渡轮和航班详细信息。

但是如果您认为使用多级数据网格是适合您的, 我已经修改了上面博客中的示例以使用xml。 将以下代码放在aspx.cs文件中

private void Page_Load(object sender, System.EventArgs e)
{
    if (!Page.IsPostBack)
    {
        _dataSet = new DataSet();
        _dataSet.ReadXml(Server.MapPath("Bookings.xml"), XmlReadMode.InferSchema);

        DataView dv = new DataView(_dataSet.Tables["Bookings"]);
        DataGrid1.DataSource = dv;
        DataGrid1.DataBind();


    }
}

protected void HandleOnDataGridItemDataBound(object sender, DataGridItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {
        DataGrid productsDataGrid = (DataGrid)e.Item.FindControl("ProductsDataGrid");
        productsDataGrid.DataSource = new DataView(_dataSet.Tables["Products"]);
        productsDataGrid.DataBind();

    }
}

protected void HandleOnProductsDataGridItemDataBound(Object sender, DataGridItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {

        DataGrid ferryDataGrid = (DataGrid)e.Item.FindControl("FerryDataGrid");
        ferryDataGrid.DataSource = new DataView(_dataSet.Tables["Ferry"]);
        ferryDataGrid.DataBind();

        DataGrid flightDataGrid = (DataGrid)e.Item.FindControl("FlightDataGrid");
        flightDataGrid.DataSource = new DataView(_dataSet.Tables["Flight"]);
        flightDataGrid.DataBind();
    }
}

把它放在aspx文件中

 <asp:DataGrid ID="DataGrid1" runat='server' AutoGenerateColumns='false'
                OnItemDataBound='HandleOnDataGridItemDataBound'
                >
                <Columns>                    
                    <asp:BoundColumn DataField='Name' HeaderText='Booking'/>                            
                    <asp:TemplateColumn HeaderText="Products">
                        <ItemTemplate>
                            <asp:DataGrid ID='ProductsDataGrid' runat='server' AutoGenerateColumns='false' 
                                OnItemDataBound='HandleOnProductsDataGridItemDataBound'>
                                <Columns>
                                    <asp:BoundColumn DataField="Details" HeaderText='Product details' />
                                    <asp:TemplateColumn>
                                        <ItemTemplate>
                                           <asp:DataGrid ID="FerryDataGrid" runat="server">
                                            </asp:DataGrid>
                                        </ItemTemplate>
                                    </asp:TemplateColumn>
                                    <asp:TemplateColumn>
                                        <ItemTemplate>
                                            <asp:DataGrid ID="FlightDataGrid" runat="server">
                                            </asp:DataGrid> 
                                        </ItemTemplate>
                                    </asp:TemplateColumn>
                                </Columns>
                            </asp:DataGrid>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                </Columns>
            </asp:DataGrid>

我已经修改了你的xml,看看它是如何显示更多字段和多个预订节点的。你必须在Bookings - Products -Ferry和Flight之间建立某种关系来设置行过滤器。

<items>
    <Bookings>
        <Name>Mr Pf_Test_15033</Name>
        <Total>315</Total>
        <Products>
            <Details>Flight and Ferry bookings</Details>
            <Flight>
                <Name>Flight1</Name>
                <Adults>2</Adults>
            </Flight>
            <Ferry>
                <Name>Ferry1</Name>
                <Adults>2</Adults>
            </Ferry>
        </Products>
    </Bookings>
</items>

答案 1 :(得分:0)

您可以在ItemTemplate中使用DataList而不是开销(使用Xml Web控件)。编写一个XSLT将xml转换为您喜欢的任何内容。从长远来看,这将更快,更灵活,尽管你的大脑可能会爆炸尝试编写xslt。下面的代码是ItemDataBound事件示例:

 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {

            // Retrieve the controls in the current DataListItem.                               
            System.Web.UI.WebControls.Xml xmlLogEntry = (System.Web.UI.WebControls.Xml)e.Item.FindControl("XmlLogEntry");
            //YOU WILL HAVE TO CREATE A HELPER METHOD THAT BINDS THE DATA
            string xml = Convert.ToString(
                ((DataRowView)e.Item.DataItem).Row.ItemArray[6].ToString());

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            xmlLogEntry.XPathNavigator = xmlDoc.CreateNavigator();                
            xmlLogEntry.TransformSource = @"~/XSLT/Transform.xslt";
        }