将数据行添加到数据表

时间:2016-04-24 11:48:56

标签: c# xml gridview

目前我正在阅读有许多子节点的xml,需要将子节点的元素绑定到gridview。所以我循环遍历节点并添加数据行。但我的逻辑问题。当我遍历1个节点时,我创建了datarow。在该节点中有2个元素。所以它首先在第一个元素上循环,然后将该元素绑定到行。在同一个循环中我说添加dt.Rows.Add(dtrow)。所以它添加一行一个元素。它再次循环并将第二个元素添加到全新的行中。这是错的。我想在同一行中添加2个元素。我该如何解决这个问题?

foreach (XmlNode vers in g)
{
    foreach (XmlNode vr in vers)
    {
        foreach (XmlNode a in vr)
        {
            dtrow = dt.NewRow();
            if (a.Name == "Title")
            {
                dtrow["Title"] = a.InnerText.Trim();    
            }
            if (a.Name == "Location")
            {    
                dtrow["Location"] = a.InnerText.Trim();
            }
            dt.Rows.Add(dtrow); // this causes issue.               
        }        
    }    
}

1 个答案:

答案 0 :(得分:0)

不是像那样做嵌套循环,而是只能循环遍历<e>中的元素,比如DataTable中的行,即<e>的数量等于插入表的行数。在每次迭代中,都可以使用<e>从当前SelectSingleNode()的子元素中收集所有信息。

例如,假设vers包含与DataTable行对应的元素,您可以执行以下操作:

foreach (XmlNode vr in vers)
{
    dtrow = dt.NewRow();
    dtrow["Title"] = vr.SelectSingleNode("Title").InnerText.Trim();
    dtrow["Location"] = vr.SelectSingleNode("Location").InnerText.Trim();
    dt.Rows.Add(dtrow);
}

*如果此问题背后的XML与您的previous question

相同,请不要忘记使用前缀和命名空间管理器

在没有命名空间管理器的情况下回复您关于这样做的评论;忽略名称空间是可能的,但通常也不赞成,因为名称空间是有原因的。

您可以使用XPath的local-name()函数来匹配元素,而不考虑其命名空间,例如:

dtrow["Title"] = vr.SelectSingleNode("*[local-name()='Title']")
                   .InnerText
                   .Trim();

或使用LINQ匹配XmlNode的{​​{1}}属性,类似于您最初的做法:

Name