2013-07-24 4 views
0

У меня есть TreeView, который содержит узлы, и после нажатия на один из них данные загружаются из файла и заполняются TextBoxes и т. Д. Я хочу предотвратить создание дубликатов, поэтому каждый раз, когда текст «title» textBox содержит запись который уже существует в .xml-файле, он удаляется. Моя проблема в том, что после первого нажатия кнопки, которая добавляет запись, все в порядке. Но после второго щелчка (textBox.Text значение не изменяется, так что это будет дубликат) узел исчезает, даже если я его модифицирую. И после каждого двойного щелчка добавляется новый дочерний узел в treeView. Я попытался сделать это сам, но у меня кончились идеи.LINQ to XML, изменяющий существующие узлы

код кнопки:

 private void button1_Click(object sender, EventArgs e) 
    { 


     XDocument doc = XDocument.Load("test.xml"); 
     bool ifDuplicate = doc.Descendants("dog") 
         .Any(x => (string)x.Attribute("name") == textBox1.Text); 
     if (ifDuplicate == true) 
     { 
      var xElement = (from q in doc.Elements("dogs").Elements("dog") 
          where q.Attribute("name").Value == textBox1.Text 
          select q); 
      foreach (var a in xElement) 
       a.Remove(); 
      doc.Save("test.xml"); 
      return; 
     } 

      gender(); //determines in which root node this entry will appear as child node; just comboBox with few exceptions 
      TreeViewOperations.SaveTree(treeView1, "test2.xml"); //saving treeView1 
      Save("test.xml"); //saving file that contains data form textBoxes etc. 
      statusBarUpdate(); 

    } 

Так что мой вопрос: есть ли лучший способ изменить существующие узлы и удаление дубликатов? Также можно приложить метод загрузки, если это необходимо.

редактировать: Сохранить метод

private void Save(string filename) 
    { 
     XDocument database = XDocument.Load(filename); 
     XElement dog = new XElement("dog"); 
     database.Element("dogs").Add(dog); 
     dog.Add(new XAttribute("name", textBox1.Text)); 
     dog.Add(new XElement("breed", comboBox3.Text)); 
     dog.Add(new XElement("sex", radioButton3.Checked)); 
     database.Save(filename); 
    } 
+0

Где вы добавите запись в XML? –

+0

Я обновил вопрос с кодом. – PotatoBox

+1

Когда 'ifDuplicate' является' true'. Вы удаляете элемент без добавления нового. Это нормально? Это не только предотвращает дублирование, не будет никакого элемента с именем 'textBox1.Text'. –

ответ

1

Я думаю, ваша проблема исходит от return в if (ifDuplicate) блоке, как это предотвратить метод, чтобы добавить новый элемент.

Вот решение, которое я хотел бы использовать:

private void button1_Click(object sender, EventArgs e) 
{ 
    XDocument doc = XDocument.Load("test.xml"); 

    // Removes all existing elements 
    foreach (XElement xElement in from q in doc.Elements("dogs").Elements("dog") 
            where q.Attribute("name").Value == textBox1.Text 
            select q) 
     xElement.Remove(); 

    gender(); //determines in which root node this entry will appear as child node; just comboBox with few exceptions 
    TreeViewOperations.SaveTree(treeView1, "test2.xml"); //saving treeView1 
    Save("test.xml"); //saving file that contains data form textBoxes etc. 
    statusBarUpdate(); 
} 
+0

Я не могу заставить ваш код работать, но это не имеет значения, так как вы были правы о «возврате». Я столкнулся с новой проблемой: что, если будут две собаки по имени «Майк», но другая порода. Я добавил следующий boolean, называемый ifDuplicatedBreed, и он работает по назначению. Завтра я буду играть больше с кодом, и если не будет ошибок, вызванных указанным выше, я буду отмечать ваше сообщение как ответ. – PotatoBox

Смежные вопросы