【问题标题】:Change nodes of treeview更改树视图的节点
【发布时间】:2011-12-09 23:11:10
【问题描述】:

我有一个像下面这样的树视图
我使用 c# 进行 winform 编程

  1. 监视器
    • LG
    • 三星
    • 惠普
  2. 键盘
    • 惠普
    • 戴尔
      • 黑色
      • 白色
  3. 鼠标

你能告诉我如何在这个例子中以编程方式更改第一个和第二个节点的位置。

【问题讨论】:

  • 您使用的代码结构是什么?或者在哪里使用输出(wpf、asp.net (mvc)、winforms)?
  • 如何在树视图中插入数据?这次重组的用例是什么?

标签: c# winforms treeview


【解决方案1】:

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

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

【讨论】:

    【解决方案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);
      }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • hi @Davide Piras 我们可以在 products 表中添加另一个名为 PositionId 的字段,并且可以根据 PositionId 列出产品及其子列表,这是一个更好的想法吗?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-27
          • 2013-10-11
          • 1970-01-01
          相关资源
          最近更新 更多