Winform中TreeView的checkbox问题

.Net技术 码拜 7年前 (2015-07-18) 1483次浏览 0个评论

功能:当点击父节点的checkbox则子节点的checkbox也跟随变化
问题:当点击父节点过快时,子节点的变化就跟不上
代码:

    public partial class TreeViewAndCheckbox : Form
    {
        public TreeViewAndCheckbox()
        {
            InitializeComponent();

            //treeview显示checkbox
            treeView1.CheckBoxes = true;
            this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);

            TreeNode parentNode = new TreeNode("测试父节点");
            treeView1.Nodes.Add(parentNode);
            TreeNode tmpNode01 = new TreeNode("子节点1");
            parentNode.Nodes.Add(tmpNode01);
            TreeNode tmpNode02 = new TreeNode("子节点2");
            parentNode.Nodes.Add(tmpNode02);
            TreeNode tmpNode03 = new TreeNode("子节点3");
            parentNode.Nodes.Add(tmpNode03);
            TreeNode tmpNode04 = new TreeNode("子节点4");
            parentNode.Nodes.Add(tmpNode04);

        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {

            if (e.Action == TreeViewAction.ByMouse)
            {
                if (e.Node.Checked)
                {
                    //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, true);

                }
                else
                {
                    //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, false);
                    //如果节点存在父节点,取消父节点的选中状态
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, false);
                    }
                }
            }
        }
        //取消节点选中状态之后,取消所有父节点的选中状态
        private void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;

            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }
        //选中节点之后,选中节点的所有子节点
        private void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
                foreach (TreeNode tn in nodes)
                {

                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
        }
    }

网上找答案,说是windows6.x下面的bug,但是没有找到解决方案,求解?

20分

#1

先说下你的VS环境,NET版本
20分

#2

写在nodeclick里呢
20分

#3

点击过快,子节点 选中就跟不上?

-》
  //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, true);              这个方法 调用不对吧。
给段代码,是很早以前写的。

 void tvLeft_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                CheckAllChildNodes(e.Node, e.Node.Checked);
                //选中父节点 
                bool bol = true;
                if (e.Node.Parent != null)
                {
                    for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)
                    {
                        if (!e.Node.Parent.Nodes[i].Checked)
                            bol = false;
                    }
                    e.Node.Parent.Checked = bol;
                }
            }
        }
        #region  选中子节点
        public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                node.Checked = nodeChecked;
                if (node.Nodes.Count > 0)
                {
                    this.CheckAllChildNodes(node, nodeChecked);
                }
            }
        }
        #endregion
20分

#5

没有体会的人是不能理解的。
20分

#6

解决方法:1.弱化此功能的作用。

#7

回复3楼:

不是方法的问题,好像环境的问题?我百度查找,说是windows6.x下面的bug。我用的是VS2012,.NET framework4.5

#8

已解决:解决方案如下 :

public class MyTreeView : TreeView
    {
        protected override void WndProc(ref Message m)
        {
            // Suppress WM_LBUTTONDBLCLK
            if (m.Msg == 0x203) { m.Result = IntPtr.Zero; }
            else base.WndProc(ref m);
        }
    }

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Winform中TreeView的checkbox问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!