Gridview绑定到XML

我试图创建一个简单的网格视图绑定到一个简单的XML文档,但我必须遗漏一些东西,因为我不断得到错误消息:

ID为’GridView1’的GridView的数据源没有任何属性或属性可用于生成列。 确保您的数据源包含内容。

      

XML

    1096 About Us 21/12/2009 17:03:43 writer   1099 News 21/12/2009 17:03:47 writer   1098 Another page 21/12/2009 17:03:52 writer   

可能是我的xpath错了,还是我在这里犯了一些根本错误的东西?

有很多方法可以让它发挥作用:

  1. 使用Brian的解决方案,即重写XML以使用属性而不是子节点。
  2. 使用XSLT转换将子节点动态转换为属性。 有关可以执行该操作的XSLT,请参阅此SO问题 。
  3. 将XML数据加载到DataSet中,DataSet在内部执行此转换。

这是一个如何做#3的例子:

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

最后一种方法的局限性在于,您不会像使用数据源控件那样获得自动数据绑定。 但是,由于XmlDataSource无论如何都是只读控件,因此不一定是严重的限制。

XmlDataSource使用属性,而不是子实体。 你需要这样做:

  

而不是使用子元素。 不幸的是这是这样的; 我真的希望它适用于替代方案; 我更喜欢这种方法。

尝试将xpath更改为

看起来像XPath="data/node"

动态数据绑定到XML文档

如果您的Xml具有更多信息,您将能够更轻松地遍历结构,因为它更容易识别您正在寻找的确切节点。

我们有一个Web服务,它以行/列结构返回XML(类似于上面的数据示例)

为了速度,我复制/粘贴我们的解决方案,但你应该得到要点,并能够破解它做你的事情。

   Query Successful          SomeData             SomeData       

这是c#实现

  • 我们将列名称输出以传递给Gridviews.Datakey names数组中的数据
  • 我们循环遍历行,在我们进行的过程中将每一行添加到数据集中
  • 我们将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;}  //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("" +myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).ParentNode.InnerXml + ""); //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;