Изменить узлы дерева - PullRequest
       1

Изменить узлы дерева

1 голос
/ 07 декабря 2011

ниже у меня вид дерева
я использую c # для программирования winform

  1. МОНИТОР
    • LG
    • Samsung
    • HP
  2. КЛАВИАТУРА
    • HP
    • Dell
      • черный
      • белый
  3. MOUSE

так что вы можете сказать мне, как я могу программно изменить места 1-го и 2-го узлов в этом примере.

Ответы [ 5 ]

6 голосов
/ 07 декабря 2011

Просто получите ссылку на узел, который вы хотите переместить, удалите его и вставьте в нужный индекс

//get the ref
TreeNode node = treeView.Nodes[0];
//remove
treeView.Nodes[0].Remove();
//insert
treeView.Nodes.Insert(1, node);
2 голосов
/ 07 декабря 2011

Вот пример для компиляции.Я реализовал обменник узлов как метод расширения TreeView.Обратите внимание на BeginUpdate ... EndUpdate звонки.Обязательные ссылки: System.Core.dll, System.Drawing.dll и System.Windows.Forms.dll.

using System;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Windows.Forms;

public static class ExtensionMethods
{
  public static void ExchangeRootNodes(this TreeView treeView, string key1, string key2)
  {
    treeView.BeginUpdate();
    try {
      int i1 = treeView.Nodes.IndexOfKey(key1);
      if (i1 == -1)
        throw new ArgumentException("No node with this key: " + key1, "key1");
      int i2 = treeView.Nodes.IndexOfKey(key2);
      if (i2 == -1)
        throw new ArgumentException("No node with this key: " + key2, "key2");
      if (i1 == i2)
        return;
      var node1 = treeView.Nodes[i1];
      var node2 = treeView.Nodes[i2];
      node1.Remove();
      node2.Remove();
      if (i1 < i2) {
        treeView.Nodes.Insert(i1, node2);
        treeView.Nodes.Insert(i2, node1);
      } else {
        treeView.Nodes.Insert(i2, node1);
        treeView.Nodes.Insert(i1, node2);
      }
    } finally {
      treeView.EndUpdate();
    }
  }
} 

public static class Program 
{
  public static void Main() 
  {
    var form = new Form() { Left = 100, Top = 100, ClientSize = new Size(220, 300), Text = "Node Exchange Test" };

    var treeView = new TreeView() { Left = 10, Top = 10, Width = 200, Height = 245 };
    form.Controls.Add(treeView);
    treeView.BeginUpdate();
    try {
      treeView.Nodes.Add("MONITOR", "MONITOR");
      treeView.Nodes[0].Nodes.Add("LG");
      treeView.Nodes[0].Nodes.Add("Samsung");
      treeView.Nodes[0].Nodes.Add("HP");
      treeView.Nodes.Add("KEYBOARD", "KEYBOARD");
      treeView.Nodes[1].Nodes.Add("HP");
      treeView.Nodes[1].Nodes.Add("Dell");
      treeView.Nodes[1].Nodes[1].Nodes.Add("Black");
      treeView.Nodes[1].Nodes[1].Nodes.Add("White");
      treeView.Nodes.Add("MOUSE", "MOUSE");
      treeView.ExpandAll();
    } finally {
      treeView.EndUpdate();
    }

    var button = new Button() {Left = 10, Top = 265, Width = 200, Height = 25, Text = "MONITOR <-> KEYBOARD" };
    form.Controls.Add(button);
    button.Click += delegate(object sender, EventArgs e) {
      try {
        treeView.ExchangeRootNodes("MONITOR", "KEYBOARD");
      } catch (ArgumentException exception) {
        MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
    };

    form.Visible = true;
    Application.Run(form);
  }
}
0 голосов
/ 09 декабря 2011
int indCurr = treeView.SelectedNode.Index;
int levelCurr = treeView.SelectedNode.Level;
if (indCurr == 0) return;

if (levelCurr == 0)
{
  TreeNode prevNode = treeView.Nodes[indCurr - 1];
  prevNode.Remove();
  treeView.Nodes.Insert(indCurr, prevNode);
}
else
{
  TreeNode prevNode = treeView.SelectedNode.Parent.Nodes[indCurr - 1];
  prevNode.Remove();
  treeView.SelectedNode.Parent.Nodes.Insert(indCurr, prevNode);
}
0 голосов
/ 07 декабря 2011

Чистым способом является сортировка дерева с вашим пользовательским TreeViewNodeSorter .Например, вы можете написать порядок сортировки в свойстве Tag каждого узла дерева и использовать его для сортировки дерева.

0 голосов
/ 07 декабря 2011

Я предполагаю, что вы в Windows Forms.

посмотрите на этот ответ: C # - TreeView: вставка узла в определенную позицию.

в вашем случае вы можете вставить узел KEYBOARD в положение 0, и узел MONITOR, вероятно, переместится вниз в положение 1, но вы могли бы сделать это при непосредственном построении дерева в первый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...