现在有这么一个常见的功能需求:树形控件需要批量勾选,且勾选父节点默认将子节点全部勾上;当子节点全部取消勾选后,父节点的勾选也取消掉;勾选一个子节点,默认就把父节点也置于勾选状态。
最常见的案例就是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控件。这里就不详细说了。