2013-07-25 52 views
0

我写过从xml文件加载值到textBoxes的方法。LINQ to XML handling duplicates

private void load(TreeNodeMouseClickEventArgs e) 
{ 
    XDocument doc = XDocument.Load(@"test.xml"); 
    string nodeName = e.Node.Text; 

    var data = from q in doc.Descendants("dog") 
       where (string)q.Attribute("name") == nodeName 
       select new Data 
       { 
        name = q.Attribute("name").Value, 
        breed = q.Element("breed").Value, 
        sex = q.Element("sex").Value 
       }; 


    foreach (var element in data) 
    { 
     textBox1.Text = element.name; 
     textBox2.Text = element.breed; 
     comboBox1.Text = element.sex; 
    } 
} 

它工作正常,只要我不会用相同的name但不同breed添加其他的狗。我的XML文件是这样的:

<dogs> 
<dog name="Mike"> 
<breed>dachshund</breed> 
<sex>true</sex> 
</dog> 
<dog name="Mike"> 
<breed>husky</breed> 
<sex>true</sex> 
</dog> 
</dogs> 

当我从第二个节点试图负载值,什么都不会发生,因为命名Mike项目被发现较早。尝试使用列表,但它没有工作(或者只是我做错了什么)。我想允许这种“重复”,只有1:1重复是forriben(已经写了这部分,它的工作原理)。如果以相似的方式获得breed,我获得name,它将解决问题 - 只需在查询中添加另一个where即可。

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    nodeName = e.Node.Text; 
} 

这是我应得name - 通过单击所需的节点treeView。如果名称相同的多个条目相同,则只加载最新的条目。所以我的问题是:如何处理?很明显,可以有一只名叫汤姆的狗,养殖达克沙德狗和名叫汤姆的狗,面包沙哑。

+0

当你在一个循环中给文本框赋值时,你只会分配最后一个值。你试图达到什么目的? –

+0

是的,你说得对,那是我的问题。我想能够加载特定的节点,但现在如果有两个节点具有相同的'name',则无论如何加载最后一个节点。作为@ Jean-Bernard Pellerin,我可以使用另一个属性,标记。 – PotatoBox

+0

它是winforms还是web应用程序? –

回答

1

使用Tag属性而不是Text之一。

您必须修改填充树的方式,但您可以将特定对象或值分配给Node.Tag,然后再检索它。这可以包含一个ID或潜在的所有关于给定狗的信息。然后在treeView1_NodeMouseClick方法中,TreeNodeMouseClickEventArgs e将包含比仅显示文本更多的信息。