怎麼讓所有子節點被選中,父節點自動選中 TreeView
- 2022-07-29
展開全部
程式碼就不貼了,給你個解決的方法,判斷節點的選中狀態,然後獲取該節點的父節點下的所有子節點,判斷是否所有子節點都選中了,若是的話就選中父節點
展開全部
如果父結點已經選中了的話,可以直接透過資料庫等方法列舉子結點為,若不需要顯式的在TVW控制元件中表示這個選中的話,直接將這種操作視為子結點全選即可。
展開全部
遍歷父節點的所有子節點
展開全部
//設定標誌,防止死迴圈
bool check = false;
//節點勾選後事件,如果更改某一節點狀態會自動觸發,所以在後面的方法中無需遞迴
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if(check==false)
setchild(e。Node);
setparent(e。Node);
check = false;
}
//設定子節點狀態
private void setchild(TreeNode node)
{
foreach (TreeNode child in node。Nodes)
{
child。Checked = node。Checked;
}
check = true;
}
//設定父節點狀態
private void setparent(TreeNode node)
{
if (node。Parent != null)
{
//如果當前節點狀態為勾選,則需要所有兄弟節點都勾選才能勾選父節點
if (node。Checked)
foreach (TreeNode brother in node。Parent。Nodes)
{
if (brother。Checked == false)
return;
}
node。Parent。Checked = node。Checked;
}
}
原理:先遞迴到最底層節點,由checkChild()勾選上最底層節點,然後改變check狀態,再checkParent()勾選最底層的上一層節點,雖然觸發勾選事件,但是check狀態改變了,不能再向下勾選,只能向上遞迴,從而防止了死迴圈。
普通方式死迴圈原理:遞迴到最底層後,勾選上最底層,然後勾選最底層的上一層,但是會自動觸發勾選事件,再次遞迴到最底層,因此造成死迴圈。
這樣吧,還是直接給你程式碼
if (treeview1。selectednode!=null && treeview1。selectednode。parent!=null)
{
treenode pn=treeview1。selectednode。parent;
treeview1。selectednode = pn;
}