天天看點

.NET-修改TreeView控件使實作CheckBoxs父子選中狀态同步和自動顯示調整

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節點,其所有子節點選中,

.NET-修改TreeView控件使實作CheckBoxs父子選中狀态同步和自動顯示調整

在控件區域外點選滑鼠,CheckBoxs控件自動隐藏,如下所示,

.NET-修改TreeView控件使實作CheckBoxs父子選中狀态同步和自動顯示調整

源代碼

http://download.csdn.net/detail/daigualu/9797107