http://www.cnblogs.com/excellently/p/TreeViewCheckBox.html
在C# Winform項目中用到了TreeView控件,並且需要勾選的功能。父子節點聯動,需要實現如下:
1.當選中父節點的時候,如果它的子節點有沒有選中的,則選中。
2.當取消選中父節點的時候,將所有子節點都取消選中。
3.當選中子節點的時候,要判斷它的父節點中的所有子節點,是不是都已經選中,如果都選中則選中父節點。
4.當取消子節點的時候,要判斷父節點是否已經被勾選上,如果勾選上則取消選中父節點。
注意:所有的節點都有可能既是父節點,又是子節點。舉例:當效果3滿足時,選中了父節點,那么這個父節點有自己的父節點,那么就要再執行一遍效果3.
如果我們處理了一個節點,那么這個節點相關聯的父節點,和父節點的父節點,。。。,以及這個節點的子節點,和這個節點的子節點。。。,都會發生聯動反應。所以我在處理這個問題的時候,用到了遞歸。
TreeView有一個事件:AfterCheck。我們不用去命名新的遞歸,直接用這個事件,當勾選了一個節點的時候,會進入這個事件,在這個事件內用代碼去勾選節點的時候,也會觸發這個事件。AfterCheck的參數就是勾選的節點。;對於我聯動勾選節點的情況而言,這個就是遞歸。
勾選節點聯動代碼,只要在AfterCheck事件內編寫代碼就可以達到效果,下面是代碼,沒有注釋:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
try
{
if (e.Node.Nodes.Count > 0)
{
bool NoFalse = true;
foreach (TreeNode tn in e.Node.Nodes)
{
if (tn.Checked == false)
{
NoFalse = false;
}
}
if (e.Node.Checked == true || NoFalse)
{
foreach (TreeNode tn in e.Node.Nodes)
{
if (tn.Checked != e.Node.Checked)
{
tn.Checked = e.Node.Checked;
}
}
}
}
if (e.Node.Parent != null && e.Node.Parent is TreeNode)
{
bool ParentNode = true;
foreach (TreeNode tn in e.Node.Parent.Nodes)
{
if (tn.Checked == false)
{
ParentNode = false;
}
}
if (e.Node.Parent.Checked != ParentNode && (e.Node.Checked == false || e.Node.Checked == true && e.Node.Parent.Checked == false))
{
e.Node.Parent.Checked = ParentNode;
}
}
}
catch (Exception ex)
{
}
}
上面已經寫的很詳細了,注釋我就不寫了。