【问题标题】:Adding or Removing a level to a TreeNode向 TreeNode 添加或删除级别
【发布时间】:2017-07-09 19:57:58
【问题描述】:

我想知道是否可以使用 Windows 窗体中的 TreeView 添加或删除级别?

例如: 我的树视图是这样开始的:

ParentNode  
|    Child1  
|    Child2  

如果用户点击一个按钮来为 Child2 添加一个级别,它将变为:

ParentNode   
|    Child1  
|    |    Child1.1  

有一个Node.Level 函数,但只能用于获取级别而不是设置它。

编辑:
节点是自动构建的,级别是根据 Excel 单元格的样式分配的。问题是,由于excel文件制作不当,创建的节点恰好不在正确的位置。所以我看到 2 个选项来解决这个问题:

1-用户直接修改excel文件
2- 我在选择的节点上创建了一个 Move Left Move Right 按钮。

我想提供第二种可能性。

这是我用来构建节点的代码:

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

【问题讨论】:

  • 这完全取决于您如何添加节点,仅此而已。
  • @HansPassant 你想让我添加我如何构建节点的代码吗?老实说,我看不出这会如何影响向左或向右移动节点。
  • 我不明白这个问题。将节点添加到树视图时,必须输入父节点作为参数,在您的示例中将为 Child1 那么您遇到的问题是什么?
  • @GuidoG 请参阅编辑。我提供了一些上下文和构建节点的方式,更准确地说是我尝试实现这一目标的原因
  • @ElliottAddi 查看我的更新答案

标签: winforms treeview treenode


【解决方案1】:

我不得不将我的答案完全更改为已更改的问题。 这似乎在我的测试中起到了作用。它将选定的节点移动到一个新的级别,在它上面的那个之下。 它需要更多检查以确保您不会将节点移动到遗忘...

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

【讨论】:

  • 它成功了!我会稍微修改一下,这样我也可以向左移动。非常感谢您的宝贵时间!
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2017-07-25
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 2019-05-26
相关资源
最近更新 更多