Gridview 绑定到 XML
Posted
技术标签:
【中文标题】Gridview 绑定到 XML【英文标题】:Gridview binding to XML 【发布时间】:2010-12-31 14:55:54 【问题描述】:我正在尝试制作一个简单的网格视图,该视图绑定到一个简单的 xml 文档,但由于我不断收到错误消息,因此我必须遗漏一些东西:
带有id的GridView的数据源 '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 出错了,还是我在这里犯了根本性的错误?
【问题讨论】:
【参考方案1】:有很多方法可以让它发挥作用:
-
使用 Brian 的解决方案,即重写 XML 以使用属性而不是子节点。
使用 XSLT 转换将子节点动态转换为属性。有关可以执行该操作的 XSLT,请参阅 this SO question。
将 XML 数据加载到 DataSet 中,DataSet 在内部进行此转换。
这是一个如何做#3的例子:
DataSet ds = new DataSet();
ds.ReadXml(MapPath("~/App_Data/mydata.xml"));
GridView1.DataSource = ds;
GridView1.DataBind();
最后一种方法的局限性在于您无法像使用数据源控件那样获得自动数据绑定。但是,由于 XmlDataSource 无论如何都是只读控件,因此这不一定是一个严重的限制。
【讨论】:
【参考方案2】:XmlDataSource 使用属性,而不是子实体。你需要做的:
<node id="1096" name="About Us" ../>
而不是使用子元素。不幸的是,它是这样的;我真的希望它可以与替代方案一起使用;我更喜欢这种方法。
【讨论】:
我不明白你刚才说什么。 啊,它将我的示例转换为 html 标记;对于那个很抱歉。它不理解 <node><id></id> 语法;它需要像 <node id="1" name="test" desc="that" /> 中的属性。【参考方案3】:尝试将 xpath 更改为
看起来像XPath="data/node"
【讨论】:
没有帮助。我尝试过不同的路径,甚至不同的 xml 文件。 要使用你需要的元素中的数据,你需要做这样的事情来将 id 从 xml 中提取出来。 Brian 在下面提出了一个很好的观点,即 XmlDataSouce 使用属性。动态数据绑定到 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.DataGridViewfloat: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;
【讨论】:
以上是关于Gridview 绑定到 XML的主要内容,如果未能解决你的问题,请参考以下文章
怎样将LIST中的数据绑定到GridView,并实现增删改查