通常,我們需要的功能更多的是通過展開某一個父節點同時展開所有的子節點(即:聯動),但是有時候我們也需要展開某一個節點之上的所有父節點,直到當前節點,例如在刪除某一個節點時,不想刪除之後所有節點有折疊,這時候就需要這種功能。這樣說可能不好理解,也可能是本人語言表達能力欠佳,我們來看一個圖:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgzaizo87Sw8e2vMrHteO797j5vdq146GwMaGx1bm/qsv509C1xL3ateOjrMjnyc+ho7WrysfP1tTaztLDx9Kqyb6z/b3ateOhsDExMTExobGjrMm+s/3WrrrzysfX1Lav1bm/qrW9obAxMTExobGjrLy0o7o8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140518/20140518092945218.png" alt="\">
注意兩個圖是不一樣的。
如何實現這種功能?遞歸!
利用遞歸關鍵的是找出要刪除節點的父節點(假如是C),找到父節點C之後繼續利用遞歸找出C的父節點B,找到父節點B之後繼續找出B的父節點A.... .... 還需要加一個判斷,判斷一下 父節點.Parent.Parent 看部分代碼:
string parentName=""; private void 刪除選中節點ToolStripMenuItem_Click(object sender, EventArgs e) { try { TreeNode node = treeView1.SelectedNode.Parent; if (ChuLi.deleteNode(NodeId))//這個是我自己定義的方法,大家可以忽略 { if (node != null)//如果是子節點不是根節點,那麼就展開 { parentName = node.Text; //展開的應該是父節點 ExpandNodes(treeView1.Nodes);//調用----------------------------------------- } } else { MessageBox.Show("刪除失敗!"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } //遍歷所有節點,找出指定節點 private void ExpandNodes(TreeNodeCollection tnodes) { foreach (TreeNode node in tnodes) { if (node.Text == parentname)//比較判斷,所以需要知道所選節點的父節點名字:node.Parent.Text { ExpandParentNodes(node.Parent.Nodes);//調用下一個遞歸方法 } ExpandNodes(node.Nodes); } } //關鍵點所在 private void ExpandParentNodes(TreeNodeCollection tnodes) { TreeNode parentNode; foreach (TreeNode node in tnodes) { parentNode = node; if (parentNode.Parent != null) { parentNode.Parent.Expand(); if (parentNode.Parent.Parent != null)//判斷父節點的父節點是否為空,如果已經達到根節點就是null { ExpandParentNodes(parentNode.Parent.Parent.Nodes); } else break;//已經達到根節點,退出 } } }
以上代碼就可以實現展開指定子節點的所有父節點了。
時間倉促加上技術能力有限,不足之處還望大大們斧正!
知識就是用來分享,但是轉載請注明出處!謝謝合作!