2011-01-10 14 views
1

私はデータグリッドXMLデータの問題

に私のXMLをデータバインドするためにASP.Netを使用しようとしている私は、この

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

ようになり、XML文書を供給してきた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の列しか表示されませんが、の情報をFlightとという情報で表示する必要があります。

私は見回しましたが、このようにXMLを使用している人はいないようです。

これは可能ですか?

答えて

0

あなたはマルチレベルのデータガードを求めています。あなたはデータを表示するのではなく階層データグリッドを使用して他の手段を Hereがあなたの助けになることができ、物品


で検討していましたか?

ListBoxで予約を読み込むことができ、ユーザーが予約を選択すると、FormView/DetailsViewでフェリーとフライトの詳細が表示されます。

しかし、マルチレベルのデータグリッドを使用することがあなたにとって正しいと思うなら、 私は上記のブログのサンプルをxmlで動作するように変更しました。 は

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ビットを変更したあなたaspx.csに以下のコードを入れてノードを予約します。行フィルタを設定するには、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> 
+0

一つだけ '私はコピー&ペースト場合Bookings'は再び、第二のユーザー名を入れているようですが、製品の詳細は最初のDataGridに入るがある場合、これは動作します最初のユーザーと - 任意のアイデア?これまでの助けをありがとう –

+0

はい、データ間のマッピングが必要です。 xmlをロードすると、データセットはBookings、Products、Ferry、Flightのテーブルを作成します。 htmlのテーブルレイアウトを使用している可能性があります(サンプルにあるように)役立つでしょう。 –

0

ItemTemplate内でXml Webコントロールを使用する代わりに(オーバーヘッドが少ない)DataListを使用できます。 XMLをあなたが好きなものに変換するためのXSLTを書いてください。あなたの脳は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"; 
     }