現在有這麼一個常見的功能需求:樹形控件需要批量勾選,且勾選父節點默認將子節點全部勾上;當子節點全部取消勾選後,父節點的勾選也取消掉;勾選一個子節點,默認就把父節點也置於勾選狀態。
最常見的案例就是windows功能,Dev提供了一個很強大的樹形控件-TreeList,同樣可以實現這些簡單效果。
首先我們要知道TreeList自帶的勾選控件在哪
treelist.OptionsSelection.MultiSelect = True;
treelist.OptionsSelection.UseIndicatorForSelection = True;
treelist.OptionsView.ShowCheckBoxes = True;
設置好這些屬性後,再瞭解一個事件 treelist_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
簡單理解爲 用戶更改節點的勾選狀態後發生。 當我們勾選其中一個節點後,通過遞歸的方式自下而上或自上而下去尋找父|子節點。
//勾選|取消勾選 父節點,遞歸處理子節點
private bool m_SetClick = true;
private void SetSubNodeCheck(TreeListNode p_TreeNode, bool p_SelectCheck)
{
m_SetClick = false;
foreach (TreeListNode _SubNode in p_TreeNode.Nodes)
{
_SubNode.Checked = p_SelectCheck;
SetSubNodeCheck(_SubNode, p_SelectCheck);
}
}
//勾選子節點,父節點同樣勾上
private void SetParentCheck(TreeListNode p_TreeNode)
{
if (p_TreeNode.Checked && p_TreeNode.ParentNode != null)
{
p_TreeNode.ParentNode.Checked = true;
SetParentCheck(p_TreeNode.ParentNode);
}
}
//如果當前分支下最後一個勾選的子節點取消勾選,父節點勾選狀態取消
private void SetParentNotCheck(TreeListNode p_TreeNode)
{
if (!p_TreeNode.Checked && p_TreeNode.ParentNode != null)
{
foreach (TreeListNode _Node in p_TreeNode.ParentNode.Nodes)
{
if (_Node.Checked) return;
}
p_TreeNode.ParentNode.Checked = false;
SetParentNotCheck(p_TreeNode.ParentNode);
}
}
private void tlBoi_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
// 禁用TreeView視圖重繪的功能。
tlDetail.BeginUpdate();
if (m_SetClick)
{
SetSubNodeCheck(e.Node, e.Node.Checked);
SetParentCheck(e.Node);
SetParentNotCheck(e.Node);
m_SetClick = true;
}
// 啓用TreeView視圖重繪的功能。
tlDetail.EndUpdate();
}
TreeList自帶勾選框批量勾選基本就這麼多東西,當然還有其它方式可以實現批量勾選,比如:增加勾選列,列中關聯checkEdit控件。這裏就不詳細說了。