关于WinForm TreeView的分享

  • 2020 年 3 月 12 日
  • 筆記

最近在写个测试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的分享就到这里了,如果有什么问题的欢迎提出,感谢!