2017-02-20 33 views
1

Мне было интересно, возможно ли с помощью TreeView в форме окна добавить или удалить уровень?Добавление или удаление уровня TreeNode

Например: мой TreeView, как это начать с:

ParentNode 
| Child1 
| Child2 

, если пользователь нажимает на кнопку, чтобы добавить уровень в Child2 становится:

ParentNode 
| Child1 
| | Child1.1 

Существует аа Node.Level но использовать только для получения уровня и не устанавливать его.

EDIT:
Узлы создаются автоматически, уровень назначается в зависимости от стиля ячейки excel. Проблема в том, что созданный узел не находится в правильном месте, потому что файл excel выполнен неправильно. Так что я вижу 2 варианта уплотнительные решения этой проблемы:

1 пользователь модифицирует файл первенствовать непосредственно
2- создать Move LeftMove Right кнопку на выбор узлов.

Я бы хотел предложить 2-ю возможность.

Вот код, который я использовал для создания узлов:

public static void AddNodes(Excel.Application app, 
            TreeView treeView) 
    { 
     Excel.Range selection = app.Selection; 

     ArrayList style = new ArrayList(); 

     TreeNode parentNode = treeView.SelectedNode; 

     //Selected Node => Last used node 
     for (int i = 1; i <= selection.Rows.Count; i++) 
     { 
      TreeNode tn; 

      int fontSize = Convert.ToInt32(selection.Cells[i].Font.Size); 

      if (!style.Contains(fontSize)) 
      { 
       style.Add(fontSize); 
      } 

      else if (style[style.Count - 1].Equals(fontSize)) 
      { 
       try 
       { 
        treeView.SelectedNode = treeView.SelectedNode.Parent; 
       } 
       catch (Exception x) 
       { 
        ErrorBox(x); 
       } 
      } 

      else 
      { 
       int indexPreviousCellofSameColor = style.IndexOf(fontSize); 

       //Select TN parent 
       for (int j = 1; j <= (style.Count - indexPreviousCellofSameFont); j++) 
       { treeView.SelectedNode = treeView.SelectedNode.Parent; } 

       style.RemoveRange(indexPreviousCellofSameFont + 1, style.Count - indexPreviousCellofSameFont - 1); 
      } 

      if (selection.Cells[i].Value2 == null) 
      { 
       //if empty cell, do something ... or nothing 
       treeView.SelectedNode = treeView.SelectedNode.LastNode; 
      } 
      else 
      { 
       //Add new TN to parent - TN object corresponds to excel cell 
       tn = new TreeNode() 
       { 
        Text = selection.Cells[i].Value2, 
        Tag = selection.Cells[i], 
       }; 
       treeView.SelectedNode.Nodes.Add(tn); 
       tn.ToolTipText = tn.Level.ToString(); 

       //selected TN => created TN 
       treeView.SelectedNode = tn; 
      } 
     } 
    } 
+0

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

+0

@HansPassant вы хотите, чтобы я добавил код, как я строю узлы? Честно говоря, я не вижу, как это может повлиять на перемещение узла влево или вправо. –

+0

Я не получаю проблему. При добавлении узла в древовидное представление нужно ввести родительский узел в качестве параметра, который в вашем примере будет Child1. В чем проблема, с которой вы столкнулись? – GuidoG

ответ

2

мне пришлось изменить мой ответ полностью измененный вопрос. Это, похоже, делает работу в моих тестах. Он перемещает выбранный узел на новый уровень под тем, который находился над ним. Необходимо больше проверок Offcourse, чтобы убедиться, что ваши не движущиеся узлы забвению ...

private void button1_Click(object sender, EventArgs e) 
{ 
    TreeNode selected = treeViewFilter.SelectedNode; 
    TreeNode parent = selected.Parent; 

    // find the node just above the selected node 
    TreeNode prior = parent.Nodes[selected.Index - 1]; 

    if (parent != prior) 
    { 
     treeViewFilter.Nodes.Remove(selected); 
     prior.Nodes.Add(selected); 
    } 
} 
+0

Извините, небрежно «отредактируйте» ответ ... –

+0

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

+1

без проблем. Вот где этот сайт есть для – GuidoG