вторник, 12 января 2010 г.

Управление узлами в TreeView (WinForms)

В данной статье представленны исходные коды для следующих операций управления узлами (TreeNode) в элементе управления TreeView:
1) Переместить узел вверх
2) Переместить узел вниз
3) Переместить узел в список родительских узлов
4) Переместить узел в список узлов вышестоящего узла

Речь идет о языке программирования C# и WinForms.

Вот интрефейс программы:




Обработчик кнопки для заполнения TreeView тестовыми элементами TreeNode (нижняя в правом углу):
int i = 0;
private void newNodeButton_Click(object sender, EventArgs e)
{
  // create node
  TreeNode newNode = new TreeNode(String.Format("Node {0}", i++));
  
  // add node in tree view
  if (treeView.SelectedNode != null)
    treeView.SelectedNode.Nodes.Add(newNode);
  else
    treeView.Nodes.Add(newNode);

}


* This source code was highlighted with Source Code Highlighter.

Вот код для определенных операций:

1) Узел вверх:
private void upButton_Click(object sender, EventArgs e)
{
  if (treeView.SelectedNode != null
    && treeView.SelectedNode.PrevNode != null)
  {
    // define edit collection
    TreeNodeCollection editNodes;
    if (treeView.SelectedNode.Parent != null)
      editNodes = treeView.SelectedNode.Parent.Nodes;
    else
      editNodes = treeView.Nodes;

    // define indexes
    int indexSelectedNode = treeView.SelectedNode.Index;
    int indexPreviousNode = treeView.SelectedNode.PrevNode.Index;

    // store node
    TreeNode selectedNode = treeView.SelectedNode;

    // swap
    editNodes.RemoveAt(indexSelectedNode);
    editNodes.Insert(indexPreviousNode, selectedNode);

    // select node
    treeView.SelectedNode = selectedNode;
  }
}


* This source code was highlighted with Source Code Highlighter.

2) Узел вниз:
private void downButton_Click(object sender, EventArgs e)
{
  if (treeView.SelectedNode != null
    && treeView.SelectedNode.NextNode != null)
  {
    // define edit collection
    TreeNodeCollection editNodes;
    if (treeView.SelectedNode.Parent != null)
      editNodes = treeView.SelectedNode.Parent.Nodes;
    else
      editNodes = treeView.Nodes;

    // define indexes
    int indexSelectedNode = treeView.SelectedNode.Index;
    int indexNextNode = treeView.SelectedNode.NextNode.Index;

    // store node
    TreeNode selectedNode = treeView.SelectedNode;

    // swap
    editNodes.RemoveAt(indexSelectedNode);
    editNodes.Insert(indexNextNode, selectedNode);

    // select node
    treeView.SelectedNode = selectedNode;
  }
}


* This source code was highlighted with Source Code Highlighter.

3) Узел влево:
private void leftButton_Click(object sender, EventArgs e)
{
  if (treeView.SelectedNode != null
    && treeView.SelectedNode.Parent != null)
  {

    // define edit collection
    TreeNodeCollection editNodes;
    if (treeView.SelectedNode.Parent.Parent != null)
      editNodes = treeView.SelectedNode.Parent.Parent.Nodes;
    else
      editNodes = treeView.Nodes;

    // store node
    TreeNode selectedNode = treeView.SelectedNode;

    // define indexes
    int indexSelectedNode = treeView.SelectedNode.Index;
    int indexParentNode = treeView.SelectedNode.Parent.Index;

    // move node
    treeView.SelectedNode.Parent.Nodes.Remove(selectedNode);
    editNodes.Insert(indexParentNode + 1, selectedNode);

    // select node
    treeView.SelectedNode = selectedNode;
  }
}


* This source code was highlighted with Source Code Highlighter.

4) Узел вправо:
private void rightButton_Click(object sender, EventArgs e)
{
  if (treeView.SelectedNode != null
    && treeView.SelectedNode.PrevNode != null)
  {

    // define edit collection
    TreeNodeCollection editNodes;
    if (treeView.SelectedNode.Parent != null)
      editNodes = treeView.SelectedNode.Parent.Nodes;
    else
      editNodes = treeView.Nodes;

    // store node
    TreeNode selectedNode = treeView.SelectedNode;
    TreeNode previousNode = selectedNode.PrevNode;

    // move node
    editNodes.Remove(selectedNode);
    previousNode.Nodes.Add(selectedNode);

    // select node
    treeView.SelectedNode = selectedNode;
  }
}


* This source code was highlighted with Source Code Highlighter.

Интрефейс пользователя подсказывает, какие операции доступны для выбранного элемента. Об этом заботится следующая функция:
private void updateEnablingButtons()
{
  upButton.Enabled = (treeView.SelectedNode != null
    && treeView.SelectedNode.PrevNode != null);

  downButton.Enabled = (treeView.SelectedNode != null
    && treeView.SelectedNode.NextNode != null);

  leftButton.Enabled = (treeView.SelectedNode != null
    && treeView.SelectedNode.Parent != null);

  rightButton.Enabled = (treeView.SelectedNode != null
    && treeView.SelectedNode.PrevNode != null);
}


* This source code was highlighted with Source Code Highlighter.

Ее вызываю в момент создания формы и по событию AfterSelect элемента управления TreeView