2014-12-23 34 views
1

我有这样的事件,其中i用鼠标选择在treeView1一个节点:我如何从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

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

所以在根我会看到C但C里面将没有什么,因为我只删除$回收站 如果我点击C,并删除,然后我想使treeView1.SelectedNode.Remove();这将删除/删除整个C节点。

问题是我如何才能从treeView1中删除子节点和里面的文件我的意思是说,我不会看到它,它不意味着我将它们从硬盘或我的FTP服务器中删除我只是不想查看$回收站和treeView1中的文件。

+0

“删除整个节点”是什么意思?请解释(或附上图片),以显示预期的结果。 – Blachshma

+1

使用节点的OnClick事件,将其设置为选中状态,然后删除该节点,或者遍历所有节点,直到它出现在有问题的节点上,然后将其删除。至于删除目录并让节点反映更改。您可以删除节点,然后根据您用来构建树视图的方法首先重建它。 –

+0

你的问题没有多大意义。如果你让FTP服务器删除一个目录,那么所有的文件和子目录也应该被删除。然后,当然,树中的子节点也会被删除。 –

回答

2

你必须引用父节点,它或者属于TreeView控件,或SelectedNode的父节点:

if (treeView1.SelectedNode != null) { 
    if (treeView1.SelectedNode.Parent == null) { 
    treeView1.Nodes.Remove(treeView1.SelectedNode); 
    } else { 
    treeView1.SelectedNode.Parent.Nodes.Remove(treeView1.SelectedNode); 
    } 
} 
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);