C# Gridview与XML的绑定
我正在尝试创建一个绑定到简单xml文档的简单网格视图,但我肯定遗漏了什么,因为我一直收到错误消息: id为的GridView的数据源 “GridView1”没有任何 要从中删除的属性或属性 生成列。确保您的 数据源具有内容 代码C# Gridview与XML的绑定,c#,asp.net,xml,gridview,C#,Asp.net,Xml,Gridview,我正在尝试创建一个绑定到简单xml文档的简单网格视图,但我肯定遗漏了什么,因为我一直收到错误消息: id为的GridView的数据源 “GridView1”没有任何 要从中删除的属性或属性 生成列。确保您的 数据源具有内容 代码 XML 1096 关于我们 21/12/2009 17:03:43 作家 1099 新闻 21/12/2009 17:03:47 作家 1098 另一页 21/12/2009 17:03:52 作家 可能是我的xpath出错了,还是我在这里犯了一些根本性的错误?
XML
1096
关于我们
21/12/2009 17:03:43
作家
1099
新闻
21/12/2009 17:03:47
作家
1098
另一页
21/12/2009 17:03:52
作家
可能是我的xpath出错了,还是我在这里犯了一些根本性的错误?尝试将xpath更改为
看起来像是
XPath=“data/node”
<node id="1096" name="About Us" ../>
而不是使用子元素。不幸的是,就是这样;我真的希望它能与另一种选择一起工作;我更喜欢这种方法。有很多方法可以让它发挥作用:
最后一种方法的局限性在于,不能像使用数据源控件那样实现自动数据绑定。但是,由于XmlDataSource是一个只读控件,因此这不一定是一个严重的限制。动态数据绑定到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 names数组中的数据
- 我们在这些行上循环,在进行过程中将每一行添加到数据集中
- 我们将gridviews datasounce设置为数据集
- 我们绑定()
//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;
//在前面的代码中。。。
Table.DataGridView{float:left;width:100%;}
Table.DataGridView tr{}
Table.DataGridView th{背景颜色:灰色;字体大小:粗体;颜色:白色;}
Table.DataGridView td{背景颜色:白色;颜色:黑色;字体重量:正常;}
//在代码隐藏中。。。
XmlNode myXmlNodeObject=myXmlDocService.GetData(_xmlDataString);
//绑定到GridView
//创建要绑定到的数据集
数据集ds=新数据集();
添加(“XmlDataSet”);
//以字符串数组形式获取列名
XmlDocument XMLDoc=新的XmlDocument();
XMLDoc.LoadXml(“+myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).ParentNode.InnerXml+”)//获取行/列
int colCount=myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes(“列”).Count;
string[]ColumnNameArray=新字符串[colCount];
int迭代器=0;
foreach(myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes(“列”)中的XmlNode节点)
{
ColumnNameArray.SetValue(node.Attributes[“name”].Value,迭代器);
ds.Tables[“XmlDataSet”].Columns.Add(node.Attributes[“name”].Value);//在数据集中创建单个列
迭代器++;
}
//逐行获取数据以填充数据集。行
foreach(XMLDoc.ChildNodes.Item(0)中的XmlNode RowNode。选择节点(“行”))
{
string[]行数组=新字符串[colCount];
int迭代器2=0;
foreach(RowNode.ChildNodes中的XmlNode ColumnNode)
{
SetValue(ColumnNode.InnerText,迭代器2);
迭代器2++;
}
ds.Tables[“XmlDataSet”].Rows.Add(rowArray);
}
DataGridView.DataSource=ds.Tables[“XmlDataSet”];
DataGridView.DataKeyNames=ColumnNameArray;
DataGridView.DataBind();
DataGridView.Visible=true;
没有帮助。我尝试了不同的路径,甚至尝试了不同的xml文件。要使用元素中的数据,您需要这样做,从xml中提取id。Brian在下面提出了一个很好的观点,即XmlDataSouce使用属性。我不明白你刚才说了什么。啊,它把我的例子转换成了HTML标签;很抱歉。它不理解node>id>/id>语法;它需要节点id=“1”name=“test”desc=“that”/>中的属性。
DataSet ds = new DataSet();
ds.ReadXml(MapPath("~/App_Data/mydata.xml"));
GridView1.DataSource = ds;
GridView1.DataBind();
<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>
//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;