2013-07-19 2 views
0

Предположим, у меня есть дерево с 3 категориями, каждый из которых имеет 3 дочерних узла. Я хочу удалить корневой узел, когда все дочерние узлы удаляются. Я пробовал что-то вроде этого:Удалить пустой корневой узел в treeView

 TreeNode current = treeView1.SelectedNode; 
     TreeNode parent = treeView1.SelectedNode.Parent; 

     if (parent.Nodes.Count == 0) 
     { 
      parent.Nodes.Remove(current); 
     } 

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

редактировать: Мое дерево выглядит следующим образом:

Утро

  • чистить зубы
  • пить кофе

Послеобеденный

  • ужин
  • TV

Ночь

  • Сон

Так что, если я решу удалить "Sleep", я хочу также удалить "Night". Но если я решил удалить «ТВ», я хочу сохранить «Ужин» и «День».

+1

Ты от ребенка _to_ родителя. Предполагая, что не вызывается 'NullReferenceException',' parent.Nodes.Count' всегда будет как минимум 1. –

ответ

1

Попробуйте это:

if (treeView1.SelectedNode != null) 
{ 
    if (treeView1.SelectedNode.Parent == null) treeView1.SelectedNode.Remove(); 
    else if (treeView1.SelectedNode.Parent.Nodes.Count == 1) treeView1.SelectedNode.Parent.Remove(); 
    else treeView1.SelectedNode.Remove(); 
} 
1

Если родительский знак равен NULL, то вы знаете, что находитесь на корневом узле. Таким образом, узел нужно удалить из коллекции узлов TreeView напрямую. В противном случае вы можете просто удалить выбранный узел из родителя. Нет причин даже смотреть на счет узла.

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

TreeNode current = treeView1.SelectedNode; 
if(current == null) 
    return; 

TreeNode parent = treeView1.SelectedNode.Parent; 
if (parent == null) 
{ 
    treeView1.Nodes.Remove(current); 
} 
else 
{ 
    parent.Nodes.Remove(current); 
} 
+0

Но что, если корневой узел не выбран после удаления последнего дочернего узла? Можно ли удалить его сразу после удаления последнего дочернего узла? Кроме того, я действительно не понимаю этот фрагмент - независимо от того, является ли родитель null или нет, что-то удаляется? – PotatoBox

+0

treeview1.SelectedNode может возвращать нуль, если ничего не выбрано в дереве. Кроме того, treeview1.SelectedNode.Parent будет возвращать значение null, если SelectedNode является корневым узлом. Если вы выбрали корневой узел, вы хотите удалить его из дерева; в противном случае вы хотите удалить его из коллекции узлов родителя. –

+1

Этот код не работает, как хочет OP. если «parent! = null», он может содержать 1, 2, 3 ... дочерние узлы, но вы просто удаляете «текущий узел» только во всех случаях. Если в случае родителя, содержащего только один дочерний узел, его следует удалить с помощью только дочернего узла. –

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