更改treeview的节点

时间:2011-12-07 09:51:24

标签: c# winforms treeview

我有一个如下所示的树视图
我使用c#进行winform编程

  1. MONITOR
    • LG
    • 三星
    • HP
  2. KEYBOARD
    • HP
    • 戴尔
      • 黑色
  3. MOUSE
  4. 所以你能告诉我如何在这个例子中以编程方式改变第一和第二节点的位置。

5 个答案:

答案 0 :(得分:6)

只需获取要移动的节点的引用,将其删除,然后将其插入所需的索引

//get the ref
TreeNode node = treeView.Nodes[0];
//remove
treeView.Nodes[0].Remove();
//insert
treeView.Nodes.Insert(1, node);

答案 1 :(得分:2)

这是一个可编辑的例子。我将节点交换器实现为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);
  }
}

答案 2 :(得分:0)

我假设您使用的是Windows窗体。

看看这个答案:C# - TreeView: inserting node at certain position你应该将节点插入你想要的位置。

在您的情况下,您可以将节点KEYBOARD插入位置0,MONITOR节点可能会向下移动到位置1,但您可以在第一次直接构建树时执行此操作。 / p>

答案 3 :(得分:0)

干净的方法是使用自定义TreeViewNodeSorter对树进行排序。例如,您可以在每个树节点的Tag属性中编写排序顺序,并使用它来对树进行排序。

答案 4 :(得分:0)

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);
}