Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Gridview与XML的绑定_C#_Asp.net_Xml_Gridview - Fatal编程技术网

C# Gridview与XML的绑定

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文档的简单网格视图,但我肯定遗漏了什么,因为我一直收到错误消息:

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出错了,还是我在这里犯了一些根本性的错误?

尝试将xpath更改为


看起来像是
XPath=“data/node”
<node id="1096" name="About Us" ../>


而不是使用子元素。不幸的是,就是这样;我真的希望它能与另一种选择一起工作;我更喜欢这种方法。

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

  • 使用Brian的解决方案,即重写XML以使用属性而不是子节点
  • 使用XSLT转换将子节点动态转换为属性。有关可以执行该操作的XSLT,请参阅
  • 将XML数据加载到数据集中,该数据集在内部执行此转换
  • 下面是一个如何做的示例#3:


    最后一种方法的局限性在于,不能像使用数据源控件那样实现自动数据绑定。但是,由于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设置为数据集
    • 我们绑定()
    在下面的示例中,有一些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;
    
    //在前面的代码中。。。
    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;