如何从treeView1中仅删除所选的子节点?

时间:2014-12-23 12:20:12

标签: c# .net winforms treeview

我有这个事件,我用鼠标选择treeView1

中的一个节点
private void treeView1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);

        if (treeView1.SelectedNode != null)
        {
            menuStrip.Show(treeView1, e.Location);
        }
    }
}

然后我有上下文菜单条我选择示例删除删除目录: 删除目录后我想更新treeView1结构visualy在删除的地方我的意思是我选择的节点/子节点。

private void RemoveDirectory(string remoteFile, bool fileordir)
{
    remoteFile = remoteFile.Replace('\\', '/');
    if (remoteFile.StartsWith("root"))
    {
        remoteFile = remoteFile.Replace("root", string.Empty);
    }
    string deleteRequest = txtHost.Text + remoteFile;
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + deleteRequest);
    if (fileordir == true)
    {
        request.Method = WebRequestMethods.Ftp.RemoveDirectory;
    }
    request.Credentials = new NetworkCredential(txtUsername.Text, txtPassword.Text);
    request.Proxy = null;
    request.UseBinary = false;
    request.UsePassive = true;
    request.KeepAlive = false;
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    StreamReader sr = new StreamReader(responseStream);
    sr.ReadToEnd();
    string StatusCode = response.StatusDescription;
    sr.Close();
    response.Close();
    treeView1.SelectedNode.Remove();
}

在底部,我添加了一行:

treeView1.SelectedNode.Remove();

但这将删除整个节点。 例如,如果我选择子节点/ b / c / d / e / f,如果我选择删除e,那么只应删除e和f。

如果我选择删除b,那么b c d e f应该删除。

我没有找到特定子节点的任何选定属性。

这是我的意思截图:

Remove Child Selected Node

在这种情况下,我点击选中了子节点$ Recycle Bin 当我点击删除我想从treeView1中删除$回收站和$回收站内的文件,但我将保留C将保持不会被删除。

所以在root上我会看到C但是在C里面什么都没有,因为我只删除了$ Recycle Bin 如果我点击C并进行删除,那么我想制作treeView1.SelectedNode.Remove();这将删除/删除整个C节点。

问题是我如何才能从treeView1中删除只有子节点和文件内部我的意思是我不会看到它们并不意味着我将它们从硬盘或我的ftp服务器中删除我只是不想请参阅$ recycle Bin以及treeView1中的文件。

2 个答案:

答案 0 :(得分:3)

您必须引用属于TreeView控件的父节点或SelectedNode的父节点:

if (treeView1.SelectedNode != null) {
  if (treeView1.SelectedNode.Parent == null) {
    treeView1.Nodes.Remove(treeView1.SelectedNode);
  } else {
    treeView1.SelectedNode.Parent.Nodes.Remove(treeView1.SelectedNode);
  }
}

答案 1 :(得分:0)

此方法从根节点搜索树中的节点。

private TreeNode GetNodeByStringPath(TreeNode root, string path)
    {
        string[] pathArr = path.Split('/');
        if (pathArr.First() != root.Name)
            return null;
        TreeNode currentNode = root;
        for (int i = 1; i < pathArr.Length &&currentNode!=null; i++)
        {
            int index = currentNode.Nodes.IndexOfKey(pathArr[i]);
            currentNode = currentNode.Nodes[index];
        }
        return currentNode;
    }

你可以像这样使用它:

        string path = "a/b/c/d/e";
        TreeNode node = GetNodeByStringPath(treeView1.Nodes[0], path);