我编写了将xml文件中的值加载到textBoxes
的方法。
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 :(得分:1)
使用Tag属性而不是Text
属性。
您必须修改填充树的方式,但是您可以将特定对象或值分配给Node.Tag
,然后再检索它。这可以包含id或可能包含给定狗的所有信息。然后在treeView1_NodeMouseClick
方法中,TreeNodeMouseClickEventArgs e
将包含的信息远不仅仅是显示的文字。