Winforms 向树节点添加或删除标高

Winforms 向树节点添加或删除标高,winforms,treeview,treenode,Winforms,Treeview,Treenode,我想知道在windows窗体中使用TreeView是否可以添加或删除级别 例如: 我的树视图是这样开始的: ParentNode | Child1 | Child2 如果用户单击按钮向Child2添加一个级别,则该级别将变为: ParentNode | Child1 | | Child1.1 有一个节点.Level函数,但仅用于获取级别,而不用于设置级别 编辑: 节点是自动生成的,级别是根据excel单元格的样式指定的。问题是,创建的节

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

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

ParentNode  
|    Child1  
|    Child2  
如果用户单击按钮向Child2添加一个级别,则该级别将变为:

ParentNode   
|    Child1  
|    |    Child1.1  
有一个
节点.Level
函数,但仅用于获取级别,而不用于设置级别

编辑:
节点是自动生成的,级别是根据excel单元格的样式指定的。问题是,创建的节点可能不在正确的位置,因为excel文件制作得不好。因此,我看到了两种解决此问题的方法:

1-用户直接修改excel文件
2-我在选择的节点上创建一个
向左移动
向右移动
按钮

我想提供第二种可能性

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

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;
            }
        }
    }
publicstaticvoidaddnodes(Excel.Application应用程序、,
树视图(树视图)
{
Excel.Range selection=应用程序选择;
ArrayList style=新的ArrayList();
TreeNode parentNode=treeView.SelectedNode;
//所选节点=>上次使用的节点

对于(inti=1;i,我必须完全改变我的答案,以适应改变后的问题。 这似乎完成了我测试中的工作。它将所选节点移动到一个新的级别,位于其正上方的级别之下。 它需要更多的检查,以确保您的节点不会移动到遗忘

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

这完全取决于你是如何添加节点的,没有别的。@HansPassant你想让我添加如何构建节点的代码吗?老实说,我看不出这会如何影响向左或向右移动节点。我不明白这个问题。在树视图中添加节点时,必须输入父节点作为参数,在你的示例中,这将是Child1那么您遇到的问题是什么?@GuidoG请参见编辑。我提供了一些上下文和构建节点的方式,更准确地说是我试图实现的原因this@ElliottAddi看到我的更新答案了吗?我会修改一下,这样我也可以移到左边。非常感谢你的时间!