2010-01-01 80 views
4

我試圖讓被綁定到一個簡單的XML文檔的簡單網格的看法,但我一定是失去了一些東西,因爲我不斷收到錯誤消息:GridView控件與的GridView綁定到XML

數據源id 'GridView1'沒有任何 屬性或屬性,從其中到 生成列。確保您的數據源包含內容。

代碼

<asp:GridView ID="GridView1" runat="server" DataSourceID="XmlDataSource1"> 
    <Columns> 
     <asp:BoundField DataField="id" HeaderText="ID" SortExpression="id" /> 
    </Columns> 
</asp:GridView> 
<asp:XmlDataSource ID="XmlDataSource1" runat="server" 
    DataFile="Notifications.xml" XPath="/data/node"></asp:XmlDataSource> 

XML

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <node> 
    <id>1096</id> 
    <name>About Us</name> 
    <date>21/12/2009 17:03:43</date> 
    <user id="1">writer</user> 
    </node> 
    <node> 
    <id>1099</id> 
    <name>News</name> 
    <date>21/12/2009 17:03:47</date> 
    <user id="1">writer</user> 
    </node> 
    <node> 
    <id>1098</id> 
    <name>Another page</name> 
    <date>21/12/2009 17:03:52</date> 
    <user id="1">writer</user> 
    </node> 
</data> 

是它也許是我的XPath那是錯的還是我做的東西基本上是錯誤的嗎?

回答

6

有許多的方法可以得到這個工作:

  1. 使用Brian的解決方案,這是重寫使用屬性,而不是子節點的XML。
  2. 使用XSLT轉換將子節點動態轉換爲屬性。有關可以執行該操作的XSLT,請參閱this SO question
  3. 將XML數據加載到DataSet中,該數據集在內部執行此轉換。

這裏有一個如何做#3的例子:

DataSet ds = new DataSet(); 
ds.ReadXml(MapPath("~/App_Data/mydata.xml")); 
GridView1.DataSource = ds; 
GridView1.DataBind(); 

最後這個方法的限制是,你不會自動綁定,你會與數據源控件。但是,由於無論如何XmlDataSource都是隻讀控件,所以這不一定是嚴重的限制。

0

嘗試量變到質變的XPath來

樣子XPath="data/node"

+0

沒有幫助。我試過不同的路徑甚至不同的xml文件。 – jpkeisala 2010-01-01 17:10:56

+1

使用你需要的元素中的數據 你需要做這樣的事情來將id從xml中取出。 Brian在下面說得很好,XmlDataSouce使用屬性。 」/> 2010-01-02 13:08:55

3

的XmlDataSource與屬性,而不是子實體工作。您需要這樣做:

<node id="1096" name="About Us" ../> 

而不是使用子元素。不幸的是,這是這樣;我真的希望它能與替代方案一起工作。我更喜歡這種方法。

+0

我不明白你剛纔說的。 – 2010-01-01 20:51:37

+0

啊,它將我的示例轉換爲HTML標籤;對於那個很抱歉。它不明白<節點> < id> </id>語法;它期望屬性如<節點id =「1」name =「test」desc =「that」/>。 – 2010-01-02 00:02:15

0

動態數據綁定到XML文檔

如果你的XML是用更多信息結構化,你就可以遍歷結構更輕鬆,因爲它更容易識別你尋找的節點。

我們有一個行/列結構返回XML Web服務(類似於上面的數據爲例)

對於速度伊夫複製/粘貼我們的解決方案,但你應該得到的要點,並能破解它做你的事。

<response xmlns=""> 
    <method name="ExecuteMethod"> 
    <message>Query Successful</message> 
    <summary success="true" rowcount="2" /> 
    <row> 
    <column name="ID"><![CDATA[SomeData]]></column> 
    <column name="NHS_NO"><![CDATA[SomeData]]></column> 
    <column name="HOSPITALNUMBER"><![CDATA[SomeData]]></column> 
    <column name="SURNAME"><![CDATA[SomeData]]></column> 
    <column name="FIRST_FORENAME"><![CDATA[SomeData]]></column> 
    <column name="TITLE"><![CDATA[SomeData]]></column> 
    <column name="SEX"><![CDATA[SomeData]]></column> 
    <column name="DOB">SomeData</column> 
    <column name="ADDRESS"><![CDATA[SomeData]]></column> 
    <column name="POSTCODE"><![CDATA[SomeData]]></column> 
    <column name="DOD" /> 
    </row> 
    <row> 
    <column name="ID"><![CDATA[SomeData]]></column> 
    <column name="NHS_NO"><![CDATA[SomeData]]></column> 
    <column name="HOSPITALNUMBER"><![CDATA[SomeData]]></column> 
    <column name="SURNAME"><![CDATA[SomeData]]></column> 
    <column name="FIRST_FORENAME"><![CDATA[SomeData]]></column> 
    <column name="TITLE"><![CDATA[SomeData]]></column> 
    <column name="SEX"><![CDATA[SomeData]]></column> 
    <column name="DOB">SomeData</column> 
    <column name="ADDRESS"><![CDATA[SomeData]]></column> 
    <column name="POSTCODE"><![CDATA[SomeData]]></column> 
    <column name="DOD" /> 
    </row> 
</method> 
</response> 

這裏的C#實現

  • 我們得到的列名了傳遞給數據到Gridviews.Datakey名陣列
  • 我們遍歷所有的行,加入每行到我們的數據集
  • 我們將gridviews datasounce設置爲數據集
  • 我們綁定()

有一些CSS和控制實例,以便您在下面的示例中複製/粘貼。

//In Code In Front... 

Table.DataGridView{float:left; width:100%;} 
Table.DataGridView tr{} 
Table.DataGridView th{ background-color:Gray; font-weight:bold; color:White;} 
Table.DataGridView td{ background-color:White; color:Black; font-weight:normal;} 

<asp:GridView ID="DataGridView" runat="server" CssClass="DataGridView" GridLines="Both" Visible="false" /> 


//In Code Behind... 

XmlNode myXmlNodeObject = myXmlDocService.GetData(_xmlDataString); 

    //Bind To GridView 

    //Create a DataSet To Bind To 
    DataSet ds = new DataSet(); 
    ds.Tables.Add("XmlDataSet"); 

    //Get Column Names as String Array 
    XmlDocument XMLDoc = new XmlDocument(); 
    XMLDoc.LoadXml("<result>" +myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).ParentNode.InnerXml + "</result>"); //Get Row/Columns 
    int colCount = myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes("column").Count; 
    string[] ColumnNameArray = new string[colCount]; 
    int iterator = 0; 
    foreach(XmlNode node in myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes("column")) 
    { 
     ColumnNameArray.SetValue(node.Attributes["name"].Value ,iterator); 
     ds.Tables["XmlDataSet"].Columns.Add(node.Attributes["name"].Value); //Create individual columns in the dataset 
     iterator++; 
    } 

    //Get Data Row By Row to populate the DataSet.Rows 
    foreach(XmlNode RowNode in XMLDoc.ChildNodes.Item(0).SelectNodes("row")) 
    { 
     string[] rowArray = new string[colCount]; 
     int iterator2 = 0; 
     foreach(XmlNode ColumnNode in RowNode.ChildNodes) 
     { 
      rowArray.SetValue(ColumnNode.InnerText, iterator2); 
      iterator2++; 
     } 
     ds.Tables["XmlDataSet"].Rows.Add(rowArray); 
    } 

    DataGridView.DataSource = ds.Tables["XmlDataSet"]; 
    DataGridView.DataKeyNames = ColumnNameArray; 
    DataGridView.DataBind(); 
    DataGridView.Visible = true;