我是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>
现在这在某种程度上起作用,我得到的结果只显示了Name
和Total
列,但我需要它来显示Products
的{{1}}信息和Flight
信息。
我环顾四周,但似乎找不到任何人以这种方式使用XML。
这可能吗?
答案 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";
}