TreeView扩展功能
.NET System.Windows.Forms命名控件中TreeView组件,有一个CheckBoxs属性,控制着这个控件每个节点前是否显示勾选框,如果设置为true,所有节点的勾选框选中,反之都不选中;如果选中父节点,子节点不会自动选中。根据需求,自动扩展了这个控件,使具备父子选中状态同步。如果鼠标离开这个控件,通过鼠标单击,隐藏复选框,否则进入某个节点,单击,显示复选框。
CheckBoxs父子选中状态同步
选中父节点,所有子节点也会选中,实现代码,如下:
/// <summary>
/// checkbox选中或不选中后的消息响应
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeViewX1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.ByMouse)
return;
if (e.Node.Checked == true)
setChildNodesStateOf(e.Node, true);
else
setChildNodesStateOf(e.Node, false);
}
private void setChildNodesStateOf(TreeNode node, bool state)
{
if (node == null)
return;
foreach (TreeNode childNode in node.Nodes)
{
childNode.Checked = state;
setChildNodesStateOf(childNode, state);
}
}
复选框单击自动隐藏和显示
鼠标在某个节点上,单击,显示复选框;不在任何一个节点上,单击,隐藏复选框。实现代码如下,
private void treeViewX1_MouseDown(object sender, MouseEventArgs e)
{
TreeNode node = treeViewX1.GetNodeAt(e.X, e.Y);
if (node == null)
treeViewX1.CheckBoxes = false;
else
treeViewX1.CheckBoxes = true;
treeViewX1.ExpandAll();
}
测试
填充TreeView控件,代码如下,
private void fillTree(CTreeView ctview)
{
var root = new TreeNode { Text = "根" };
ctview.RootNode = root;
root.Nodes.Add(new TreeNode { Text = "孩子1" });
root.Nodes.Add(new TreeNode { Text = "孩子2" });
root.Nodes.Add(new TreeNode { Text = "孩子3" });
root.Nodes[0].Nodes.Add(new TreeNode { Text = "孙子1" });
root.Nodes[0].Nodes.Add(new TreeNode { Text = "孙子2" });
root.Nodes[0].Nodes.Add(new TreeNode { Text = "孙子3" });
root.Nodes[1].Nodes.Add(new TreeNode { Text = "孙子1" });
root.Nodes[1].Nodes.Add(new TreeNode { Text = "孙子2" });
root.Nodes[2].Nodes.Add(new TreeNode { Text = "孙子1" });
root.ExpandAll();
}
测试结果,单击孩子1节点,其所有子节点选中,
在控件区域外点击鼠标,CheckBoxs控件自动隐藏,如下所示,