2011-01-10 24 views
1

我是新來的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數據綁定到DataGrid

到目前爲止,我已經有了這個

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信息與FlightFerry信息太。

我環顧四周,但似乎無法找到任何人以這種方式使用XML。

這可能嗎?

回答

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一點,看看它是如何顯示了更多的領域和多預訂節點。您必須在預訂 - 產品 - 飛利浦和飛行之間建立某種關係才能設置行篩選器。

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

這個作品,如果是有隻有一個`Bookings`如果我複製一遍,似乎膏將第二個用戶名,但該產品的詳細信息進入第一個DataGrid與第一個用戶 - 任何想法?感謝您的幫助 – 2011-01-11 14:39:41

0

您可以在ItemTemplate中使用帶有Xml Web控件的DataList(少開銷)。編寫一個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"; 
     }