• 关于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的分享就到这里了,如果有什么问题的欢迎提出,感谢!

  • 相关阅读:
    rsyslog 存储到 mysql
    LAMP 建立 Wordpress 站点 Linux Apache MariaDB PHP
    CentOS 6.9 CentOS 7.4 自动安装系统 kickstart
    shell编程, 100文钱买100只鸡, 简单实现
    创建私有CA, 加密解密基础, PKI, SSL
    运维派 企业面试题6 防dos攻击
    运维派 企业面试题4&5 创建10个 用户 ; ping探测主机是否在线
    运维派 企业面试题3 为上题中的 "十个随机字母_test.html" 文件 更名
    运维派 企业面试题2 创建10个 "十个随机字母_test.html" 文件
    MongoDB释放磁盘空间
  • 原文地址:https://www.cnblogs.com/guhuazhen/p/11603571.html
Copyright © 2020-2023  润新知