关于WinForm TreeView的分享~

最近在写个测试demo的时候使用到WinForm TreeView,已经好久没接触了,有些生疏,所以还是记录一下遇到的一些问题。

1、如果动态绑定TreeView,这个功能一般会在数据量不确定,需要去数据库或者其他途径获得数据,动态加载数据的时候使用。

下面我们看一下怎么实现动态版定,首先准备好数据,我这里就模拟一下,定义两个数组

 //定义值
            string[] strs = { "香蕉", "苹果", "桃子", "草莓" };
            string[] strs2 = { "红苹果", "青苹果" };//这个数组表示苹果的子项

2、下面定义两个方法,添加父节点和添加字节点的方法,这个例子比较简单,各位可以根据你们自己的需要修改代码。递归添加子节点的时候我只添加父节点下的子节点,其他节点暂时不添加,所以用到if (num == 2)   ,因为苹果是第二项,所以从2开始添加子节点

   //添加父节点的方法
        private void BindRoot(string[] strs, string[] strs2)
        {
            int i = 1;
            foreach (var item in strs)
            {

                TreeNode rootNode = new TreeNode();
                rootNode.Tag = i;
                rootNode.Text = item;
                tvData.Nodes.Add(rootNode);
                BindChildAreas(rootNode, strs2);//调用添加子节点的方法
                i++;
            }   
        }

        //添加子节点的方法,递归绑定子项       
        private void BindChildAreas(TreeNode fNode, string[] strs2)
        {
            int k = 1;
            int num=int.Parse(fNode.Tag.ToString());//父节点数据关联的数据行
            if (num==0) //递归终止,区域不包含子区域时      
            {
                return;
            }
            if (num == 2)      // 当项为2时开始添加子项
            {
                foreach (var item2 in strs2)
                {
                    TreeNode node = new TreeNode();
                    node.Tag = k;
                    node.Text =item2;
                    //添加子节点               
                    fNode.Nodes.Add(node);
                    k++;
                }
            }
           
        }

3、初始化该TreeView,调用添加根节点方法BindRoot(参数1,参数2);

//直接调用,赋参数值,即第一点定义的数组
 BindRoot(strs, strs2);//绑定tvData

4、接下来可以根据个人需求,展开节点,这里我演示一个展开TreeView所有节点的方法

    //默认展开所有节点
            for (int i = tvData.GetNodeCount(false) - 1; i > -1; i--)
            {
                tvData.SelectedNode = tvData.Nodes[i];
                tvData.SelectedNode.ExpandAll();
            }

5、接下来我们看一下效果

6、到这里已经完成了TreeView的显示功能,但是其实最重要的还是在后头,咱们不能让它中看不中用,所以下面我们要通过点击获得他的值,由于我很久没有用这个控件了,凭记忆想到的就是使用this.tvData.SelectedNode.Text获得选中的值。

但是这里有一个问题,无论我使用TreeView哪个事件都不能准确的获得选中的值,不管是click点击事件,还是mouseclick事件,点击获得的值都是上次点击事件的值,反正得到的值都不是正确的,查了网上很多文章,七七八八的试了很多方法还是有问题。

那么应该怎么办呢,几经波折找到了一个方法,供参考,通过tvData_AfterSelect事件的(TreeNode)e.Node可以获得选中节点,而且不会出错,试过很多次,基本没问题,这个方法还是有一点小问题,就是初始化时会赋值(TreeNode)e.Node为根节点的所有值,但是不影响使用。

 private void tvData_AfterSelect(object sender, TreeViewEventArgs e)
        {
            SetNodeCheckState((TreeNode)e.Node);
            string SelectData = ((TreeNode)e.Node).Text;//获得选中值
        }
        //设置选中值的状态
        private void SetNodeCheckState(TreeNode parentNode)
        {
            foreach (TreeNode node in parentNode.Nodes)
            {
                if (parentNode.Checked == true)
                    node.Checked = true;
                else
                    node.Checked = false;
                if(node.Nodes.Count>0)
                 SetNodeCheckState(node);
            }
        }

ok,今天关于WinForm TreeView的分享就到这里了,如果有什么问题的欢迎提出,感谢!

posted @ 2019-09-28 16:20  Tulip123  阅读(639)  评论(0编辑  收藏  举报