2014-11-23 4 views
0

Работаю над моим первым приложением C# Winform :( Я просматриваю XML-файл в treeView, затем я выбираю узел, и я хочу удалить его. Моя проблема: Каждый узел содержит атрибут Id, то этот узел используется два или время дерева в том же файл, анс я хочу, чтобы удалить все дубликатыУдалить узел из treeView, когда атрибут схож

Это ехр:.

<list> 
<object number="3" background_colour="7" id="2996" name="MyFirst" type="2"> 

    <child id="3794" x="0" y="0"/> 
    <child id="13794" x="0" y="44"/> 
    <child **id="13794**" x="239" y="44"/> 
</object> 
<object height="4" id="13793" line="24487" direction="1"/> 

<object height="194" **id="13794"** line_attributes="24487" line ="0"/> 
</list`> 

Итак, теперь я могу удалить узел (node ​​- это объект), но я хочу, если я удалю объект с id = 13794, я автоматически удалю также Child с id = 13794

Я действительно думаю об этом от одной недели: (если у кого-то есть идея. Благодарю.

Моя функция Код:

private void DeleteHandler(TreeNode tNode) 
    { 
     tNode.BackColor = Color.Red; 
     var messageResult = MessageBox.Show("Are u sur to delete node and childs?", "Alerte de suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (messageResult == System.Windows.Forms.DialogResult.Yes) 
      RemoveChildNodes(tNode); 
     else 
      tNode.BackColor = Color.Transparent; 
    } 


    private void RemoveChildNodes(TreeNode aNode) 
    { 

     if (aNode.Nodes.Count > 0) 
     { 
      for (int i = aNode.Nodes.Count - 1; i >= 0; i--) 
      { 
       aNode.Nodes[i].Remove(); 
      } 
     } 
     var messageResult = MessageBox.Show("Delete from XML too ?", "Alerte de suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (messageResult == System.Windows.Forms.DialogResult.Yes) 
      aNode.Remove(); 

    } 

    private void deleteNode_Click(object sender, EventArgs e) 
    { 
     TreeNode sourceNode = sourceTreeView.SelectedNode; 
     DeleteHandler(sourceNode); 
    } 
+0

Что вы сделали до сих пор, и как он не работают? Обновите вопрос. –

+0

Теперь можно выбрать узел и удалить его, но только один узел! Я хочу удалить весь узел с тем же значением атрибута ID –

+0

Пожалуйста, разместите здесь свой код, если вам нужны улучшения. Если это конфиденциально, анонимный. –

ответ

0

Использование LINQ можно удалить все узлы в XML с определенным ID, как это.

private XDocument DeleteID(string XmlFile, string NodeID) 
    { 
     XDocument list = XDocument.Load(XmlFile); 

     list.Descendants().Where(elm => (string)elm.Attribute("id") == NodeID).Remove(); 

     return list; 
    } 

Вы можете затем редактировать RemoveChildNodes быть что-то вроде:

private void RemoveChildNodes(TreeNode aNode) 
    { 
     //get the id from the node (I don't know where id is for our purpose I'll say it is in tag 
     XDocument list = DeleteID(@"c:\temp\test.xml", (string)aNode.Tag); 

     //reload the tree here 

     var messageResult = MessageBox.Show("Delete from XML too ?", "Alerte de suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (messageResult == System.Windows.Forms.DialogResult.Yes) 
     { 
      list.Save(@"c:\temp\test.xml"); 
     } 
    } 
0

Если я понимаю, что вы хотите сделать, это удалить все узлы из вас Древа, которые имеют один и тот же идентификатор. LINQ может использоваться для сборки коллекции всех узлов, имеющих определенный ID, а затем вы можете просто удалить все узлы в списке.

Извините, у меня нет времени на то, чтобы произвести какой-либо код на данный момент, но я надеюсь, что это поможет.

Хорошо, я добавил код. Вот быстрый фрагмент кода, который я выбил. Используйте его для идеи, я ее не тестировал. Это будет проверять только верхний уровень узлов, но было бы нелегко это исправить.

IEnumerable<TreeNode> Result = TreeView.Nodes.WHERE((N) => N.ID == "13794"); 
foreach(TreeNode Node in Result){TreeView.Nodes.Remove(Node);} 

Надеется, что это помогает Дэнни

+0

Это, но проблема в том, что я не знаю, как это сделать ... возможно, если у вас будет время позже, вы можете просто сказать мне, как я могу начать Спасибо –

+0

Это будет работать, только если все узлы находятся на одном уровне (нет иерархии). Вам нужно будет рекурсивно пройти дерево, чтобы найти все узлы. – Kevin

+0

Я сделал это в своем ответе Кевином. «Это будет проверять только верхний уровень узлов». – dannyhut