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