2013-07-25 50 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將包含比僅顯示文本更多的信息。