更改未反映在xml文件C#中

时间:2013-11-16 09:47:02

标签: c# combobox

我有一个组合框,您可以从中选择一个名称(这是一个屏幕的名称,其详细信息保存在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;
}

我遇到的问题是只删除组合框中默认选中的第一个项目。

为什么会这样?

2 个答案:

答案 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担心匹配...