我有一个组合框,您可以从中选择一个名称(这是一个屏幕的名称,其详细信息保存在xml文件中)。
要从xml文件中删除此屏幕,我使用此值删除屏幕(参考Name属性或屏幕标记)
我的删除代码为
XmlDocument docc = new System.Xml.XmlDocument();
docc.Load("test.xml");
System.Xml.XmlNodeList list = docc.GetElementsByTagName("Screen");
foreach (System.Xml.XmlNode node in list)
{
if (node.Attributes["Name"].Value == comboBox1.SelectedValue.ToString())
{
node.RemoveChild(node);
}
System.Windows.MessageBox.Show("Screen has been deleted.");
if (comboBox1.Items.Count > 0)
{
comboBox1.Items.Remove(comboBox1.SelectedValue.ToString());
comboBox1.SelectedIndex = 0;
}
docc.Save("test.xml");
break;
}
我遇到的问题是只删除组合框中默认选中的第一个项目。
为什么会这样?
答案 0 :(得分:1)
foreach循环结束时的break
有效地使循环只运行一次。
你可能想要的是以下
foreach (System.Xml.XmlNode node in list)
{
if (node.Attributes["Name"].Value == comboBox1.SelectedValue.ToString())
{
node.RemoveChild(node);
System.Windows.MessageBox.Show("Screen has been deleted.");
if (comboBox1.Items.Count > 0)
{
comboBox1.Items.Remove(comboBox1.SelectedValue.ToString());
comboBox1.SelectedIndex = 0;
}
docc.Save("test.xml");
break; // break now only if the node is the expected one.
}
}
答案 1 :(得分:1)
我还会将for循环更改为:
var node = from node in list
where node.Attributes["Name"].Value == comboBox1.SelectedValue.ToString()
select node;
// if you expect one run this, otherwise, put it in a foreach
node.RemoveChild(node);
// the rest...
让linq担心匹配...