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[].Nodes.Add(new TreeNode { Text = "孫子1" });
root.Nodes[].Nodes.Add(new TreeNode { Text = "孫子2" });
root.Nodes[].Nodes.Add(new TreeNode { Text = "孫子3" });
root.Nodes[].Nodes.Add(new TreeNode { Text = "孫子1" });
root.Nodes[].Nodes.Add(new TreeNode { Text = "孫子2" });
root.Nodes[].Nodes.Add(new TreeNode { Text = "孫子1" });
root.ExpandAll();
}
測試結果,單擊孩子1節點,其所有子節點選中,
在控件區域外點選滑鼠,CheckBoxs控件自動隐藏,如下所示,
源代碼
http://download.csdn.net/detail/daigualu/9797107