关于C# winform treeview 的两个问题(点击空白处的时间响应和复选框选择问题)

来源:互联网 发布:mysql 无需密码登录 编辑:程序博客网 时间:2024/05/01 14:08

这段时间正在研究这个控件,摸出了一些东西,给大家看看。

1:点击空白处的问题。
处理鼠标Up事件
 private void Tree_MouseUp(object sender, MouseEventArgs e)
{
            Point p = new Point(e.X, e.Y);
            TreeNode selectNode = AuthTree.GetNodeAt(p);
             bool isBlank = false;
            if (selectNode == null)
                isBlank = true;
            else
            {
                if(selectNode.Bounds.Contains(e.X,e.Y) == false)
                    isBlank = true;
            }
            if (isBlank)
            {
                       //处理选择空白
            }
}
主要是根据鼠标坐标和节点的两个方法:根据坐标得到节点(GetNodeAt)和节点区域(Bounds)来处理。
2:复选框选择问题
我的想法是选中某个节点时将其所有子节点全部选中,当某节点有子节点选中时则选中这个节点,否则不选择这个
节点。
因为AfterCheck事件是递归触发的,所以处理不当就会进入死循环,我是进入死递归把程序堆栈塞满了。
最后我增加了一个变量保证了连续出发的方向,即从原节点开始,向上更新父节点,向下更新子节点,父节点
不能再向下,子节点也不能向上,解决了这个问题。
int level = -1;
private void Tree_AfterCheck(object sender, TreeViewEventArgs e)
        {           
            TreeNode operateNode = e.Node;
            if (this.level == -1)
            {
                this.level = e.Node.Level;
                CheckFatherNode(operateNode);
                CheckAllSubNodes(operateNode, operateNode.Checked);
            }
            else
            {
                if(e.Node.Level < this.level)
                    CheckFatherNode(operateNode);
                else if(e.Node.Level > this.level)
                    CheckAllSubNodes(operateNode, operateNode.Checked);
            }
                      
        }

 

原创粉丝点击