2016-08-23 7 views
0

データがXMLドキュメントに格納され、asp.netグリッドビューに表示されるプロジェクトがあります。各列は、ファイル内の別のノードを表します。しかし、私はいくつかのノードのいくつかを持っている状況に達しているので、これをどのように達成できるかについてのアドバイスが必要です。XMLノードをGridviewにバインドするC#

xmlファイルが書店(W3学校からの例)で本の記録であると仮定しましょう:

<book category="web"> 
<title lang="en">XQuery Kick Start</title> 
<author>James McGovern</author> 
<author>Per Bothner</author> 
<author>Kurt Cagle</author> 
<author>James Linn</author> 
<author>Vaidyanathan Nagarajan</author> 
<year>2003</year> 
<price>49.99</price> 

あなたはこの例では、多数の作者がいる見ることができるように、もしそうなら、私はノード(この場合は作者)の複数を持って、それらをグリッドビューにロードするにはどうしたらいいですか?著者名1、著者2、著者3などの各ノードに名前を付けることをお勧めしますか?または、子ノードを作成することが可能ですか?

<author> 
     <name1> </name1> 
     <name2> </name2> 
     <name3> </name3> 
    </author> 

最後に重要なことは、作成したいノードには複数の属性があることです。したがって、上記の例を保つためには、各著者の出生日と出身地が挙げられます。

アドバイスありがとうございます。

+0

簡単な質問私はあなたが取得しているXMLのフォーマットを管理しているん...あなたのために良い答えを把握しようとしながら?また、GridViewを使用する必要がありますか? – james

+0

こんにちはJames - 私はXMLファイルの作成とフォーマットを完全に制御していますが、唯一の必要条件はgridviewに表示されるxmlドキュメントでなければならないということです。この理由は、これがすでに使用されているWebアプリケーションの拡張である追加の作業であるということです。 – smokeyace

答えて

0

私は、これを行うにはさまざまな方法があると言って始めます。あなたがしようとしていることを正確に知らなければ、私はあなたにかなりフレキシブルなものを与えます。&簡単ですが、最も簡潔ではないかもしれません。より良い解決策には、データに対してクエリを作成し、結果の行を表示することが含まれますが、それはあなたの目的にとって過度の可能性があります。私はここでこれを実証しません。

理想的には、以下のようにxmlを構造化します。

<books> 
    <book category='web'> 
     <title lang='en'>XQuery Kick Start</title> 
     <authors> 
      <author>Vaidyanathan Nagarajan</author> 
      <author>thomas waterloo</author> 
      <author>malinda gatesauthor> 
      <author>rusty weatherford</author> 
     <authors> 
     <year>2003</year> 
     <price>49.99</price> 
    </book> 
</books> 

第2に、GridViewはネストされたデータに本当にバインドしたくありません。間違いなくそれを行う方法はありますが、データをループして画面に印刷する方が良いでしょう。また、リピータコントロールを使用して調査することもできます。

次のコードを試してみてください。私はこれを新しいasp.net Webフォームプロジェクトで実行することができました。

のDefault.aspx:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 
<%@ Import Namespace="System.Xml" %> 

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent"> 
    <table> 
    <% foreach (XmlNode book in myNodes) { %> 
      <tr> 
      <% foreach (XmlNode childElement in book) { 
        string title = null; 
        string year = null; 
        string price = null; 
        List<string> authors = new List<string>(); 

        switch (childElement.Name) 
        { 
         case "title": 
          title = childElement.InnerText.ToString(); 
          break; 
         case "year": 
          year = childElement.InnerText.ToString(); 
          break; 
         case "price": 
          price = childElement.InnerText.ToString(); 
          break; 
         case "authors": 
          foreach (XmlNode grandChildElement in childElement) 
          { 
           authors.Add(grandChildElement.InnerText); 
          } 
          break; 
        }%> 

        <td><label><%= title %></label></td> 
        <td><label><%= year %></label></td> 
        <td><label><%= price %></label></td> 
        <td> 
         <%foreach(string author in authors){ %> 
          <label> <%= author %></label><br /> 
         <% } %> 
        </td> 
      <% } %> 
      </tr> 
    <% } %> 
    </table> 
</asp:Content> 

Default.aspx.cs:あなたのノード構造が複雑になれば

using System; 
using System.Data; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml; 

namespace WebApplication1 
{ 
    public partial class _Default : Page 
    { 
     protected XmlNodeList myNodes = null; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      string booksXml = @"<books> 
       <book category='web'> 
        <title>Columbus Sailed the Ocean Blue</title> 
        <year>1492</year> 
        <price>6 gold doubloons</price> 
        <authors> 
         <author>Vaidyanathan Nagarajan</author> 
         <author>john doe</author> 
         <author>jane doe</author> 
        </authors> 
       </book> 
       <book category='web'> 
        <title>Best Book Ever</title> 
        <year>1776</year> 
        <price>23.55</price> 
        <authors> 
         <author>Robert Frost</author> 
        </authors> 
       </book> 
       <book category='web'> 
        <title>Hello World!</title> 
        <year>20013</year> 
        <price>49.99</price> 

       </book> 
       <book category='web'> 
        <title>1234</title> 
        <year>1999</year> 
        <price>69.99</price> 
        <authors> 
         <author>Carmen SanDiego</author> 
         <author>Roger Rabbit</author> 
        </authors> 
       </book> 
      </books>"; 

      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(booksXml); 

      //doc.ChildNodes[0] is the entire books element and al of its children 
      //doing .ChildNodes again gives you all of the book elements 
      this.myNodes = doc.ChildNodes[0].ChildNodes; 
     } 
    } 
} 

InnerTextプロパティプロパティを使用したが打破されますが、私はそれを固定残しておきますあなたへ。お役に立てれば!

+0

James、あなたの努力に感謝します!私はこれがトリックをするかどうかはわかりません。私はXMLファイルとグリッドビューを使用することに拘束されています(現在のアプリケーションはデータを表示するためにこれを行います)。私が持っている問題は、追加の作業では、特定のXMLノードの "リスト"または "複数のエントリ"を持つデータを表示する必要があることです。グリッドビューに表示されるデータは、JSON文字列をフォーマットしてリモートAPIとやりとりするために使用されます。これまで使用されていた方法は、ページの読み込み時にxmlreadを実行し、そのデータをgridviewにバインドすることでした。これは、指定されたプロパティの複数の値までうまくいきました! – smokeyace

+0

私の最善の選択肢は、ネストされたデータを表示するためにグリッドビューの列内のリピータを使用することができると思うので、あなたの提案に感謝:) – smokeyace

+0

私はあなたの好みのアプローチを使用して新しい答えを追加しました。あなたが探していたものに近いか、それを改善する方法があれば教えてください。 – james

0

私はあなたの回答に基づいて別のショットを与えました。ここでは、ファイルの中からxmlをまっすぐに読み取って、&をバインドし、GridViewにバインドしたRepeaterでGridViewにバインドします。

GridViewのRowDataBoundイベントを監視し、次に各行について、どの行為者がその行に属しているかを調べるだけです。

xmlファイルBooks.xmlを

<books> 
    <book category='web'> 
     <title>Columbus Sailed the Ocean Blue</title> 
     <year>1492</year> 
     <price>6 gold doubloons</price> 
     <author>Vaidyanathan Nagarajan</author> 
     <author>john doe</author> 
     <author>jane doe</author> 
    </book> 
    <book category='web'> 
     <title>Best Book Ever</title> 
     <year>1776</year> 
     <price>23.55</price> 
     <author>Robert Frost</author> 
    </book> 
    <book category='web'> 
     <title>Hello World!</title> 
     <year>20013</year> 
     <price>49.99</price> 
    </book> 
    <book category='web'> 
     <title>1234</title> 
     <year>1999</year> 
     <price>69.99</price> 
     <author>Carmen SanDiego</author> 
     <author>Roger Rabbit</author> 
    </book> 
</books> 

デフォルト。aspxの

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 
<%@ Import Namespace="System.Xml" %> 



<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent"> 
    <asp:GridView ID="myGridView" runat="server" AutoGenerateColumns="false" OnRowDataBound="myGridView_RowDataBound" > 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <label> Title: <%# Eval("title")%></label> 
        <label> Year:<%# Eval("year")%></label> 
        <label> Price:<%# Eval("price")%></label> 
        <asp:Repeater ID="myRepeater" runat="server"> 
          <HeaderTemplate> 
          <table> 
           <thead>Authors: </thead> 
         </HeaderTemplate> 
         <ItemTemplate> 
          <tr> 
           <td> 
            <asp:Label ID="myLabel" runat="server"><%# Eval("author_Text")%></asp:Label> 
           </td> 
          </tr> 
         </ItemTemplate> 
         <FooterTemplate> 
          </table> 
          <br /> 
         </FooterTemplate> 
        </asp:Repeater> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
</asp:Content> 

Default.aspx.cs

using System; 
using System.Data; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml; 

namespace WebApplication1 
{ 
    public partial class _Default : Page 
    { 
     DataTableCollection tables = null; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      XmlDocument doc = new XmlDocument(); 
      DataSet ds = new DataSet(); 
      ds.ReadXml("C:\\dev\\books.xml"); 

      //ds.Tables[0] is the books table 
      //ds.Tables[1] is the authors table 
      // When reading xml into a DataSet object, the data is normalized (think SQL-like) 
      myGridView.DataSource = ds.Tables[0]; 
      tables = ds.Tables; 
      myGridView.DataBind(); 
     } 

     protected void myGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       Repeater repeater = (Repeater)e.Row.FindControl("myRepeater"); 

       // Because our data is now in tables, we need to join the tables based on the book_Id identifier 
       // The columns named book_Id in table 0 and table 1 were both created for us automatically to link up the data 
       // when we read the xml into the DataSet object. 
       var authors = tables[1].AsEnumerable().Where(x => x["book_Id"] as int? == e.Row.DataItemIndex).AsDataView(); 

       repeater.DataSource = authors; 
       repeater.DataBind(); 
      } 
     } 
    } 
} 
関連する問題