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

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

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

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

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

   //添加父节点的方法
private void BindRoot(string[] strs, string[] strs2)
{
int i = ;
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 = ;
int num=int.Parse(fNode.Tag.ToString());//父节点数据关联的数据行
if (num==) //递归终止,区域不包含子区域时
{
return;
}
if (num == ) // 当项为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) - ; i > -; 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>)
SetNodeCheckState(node);
}
}

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

关于WinForm TreeView的分享~的更多相关文章

  1. winform treeView 数据绑定

    转载:http://www.jetwu.cn/archives/737 winform treeView 数据绑定 private void Form1_Load(object sender, Eve ...

  2. Winform TreeView 查找下一个节点

    转载:http://www.cnblogs.com/Ruiky/archive/2013/02/01/2888674.html public static class TreeViewHelper { ...

  3. winform Treeview控件使用

    做角色菜单权限时用到treeview控件做树状显示菜单,简单总结了一下用法: 1.在winform窗体中拖入treeview控件,注意修改属性CheckBoxes属性为true,即在节点旁显示复选框 ...

  4. winform TreeView的一些用法以及异步加载

    今天,主要弄了一下对于树型控件的一些方法,以及异步加载.参考: http://www.cnblogs.com/greatverve/archive/2012/03/23/winform-treevie ...

  5. C# Winform TreeView 的一些基本用法

    下面是treeview的用法TreeView组件是由多个类来定义的,TreeView组件是由命名空间"System.Windows .Forms"中的"TreeView& ...

  6. C# winform TreeView中关于checkbox选择的完美类

    public static class TreeViewCheck { /// <summary> /// 系列节点 Checked 属性控制 /// </summary> / ...

  7. c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

    在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...

  8. [转]C# WinForm treeview checkbox----递归算法利用

    在平常开发中,treeview的节点显示checkbox,若节点存在几级时,往往希望,选中父节点后,其子节点都要选中,如何实现勒,请看 using System; using System.Colle ...

  9. Winform TreeView 节点拖动

    private void treeView_ItemDrag(object sender, ItemDragEventArgs e) { TreeNode dragNode = e.Item as T ...

随机推荐

  1. Demo小细节-2

    今天在牛客的题海中再次找虐,题目如下: public class B { public static B t1 = new B(); public static B t2 = new B(); { S ...

  2. Django之使用中间件解决前后端同源策略问题

    问题描述 前端时间在公司的时候,要使用angular开发一个网站,因为angular很适合前后端分离,所以就做了一个简单的图书管理系统来模拟前后端分离. 但是在开发过程中遇见了同源策略的跨域问题,页面 ...

  3. 用Python操作文件

    用Python操作文件 用word操作一个文件的流程如下: 1.找到文件,双击打开. 2.读或修改. 3.保存&关闭. 用Python操作文件也差不多: f=open(filename) # ...

  4. 求大的组合数模板 利用Lucas定理

    Lucas定理:A.B是非负整数,p是质数.A B写成p进制:A=a[n]a[n-1]…a[0],B=b[n]b[n-1]…b[0]. 则组合数C(A,B)与C(a[n],b[n])C(a[n-1], ...

  5. KDTree 板子

    从杨哥哪里偷的板子, 存一下. #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.t ...

  6. ZOJ 3872 Beauty of Array 连续子序列求和

    Edward has an array A with N integers. He defines the beauty of an array as the summation of all dis ...

  7. Hexo博客Next v7.X 主题升级,美化警示录

    本文转载于:Hexo博客Next v7.X 主题升级,美化警示录丨奥怪的小栈 前言 经历了好几天(懒癌晚期懒得数了)的与主题升级斗争后,我终于完成基本上完成了next主题的升级!升到了V7.3!哈哈哈 ...

  8. 【LeetCode】56-合并区间

    题目描述 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...

  9. 开发必配的Finder设置

    1.显示标签页.显示路径栏.显示状态栏的设置位置,在访达->显示-> 显示状态栏 个人三个都设置了,但是觉得显示状态栏用的并不多,反而多一行,下面是显示状态栏的效果,主要可以一眼看出有多少 ...

  10. Sublime Text 实用方法

    代码比对 安装Sublimerge插件 打开Sublime Text后,接着按Ctrl+Shift+P,并输入Install Package 待其加载完成,再输入Sublimerge Pro 当安装完 ...