python treeview控件使用详解_winform Treeview控件使用

做角色菜单权限时用到treeview控件做树状显示菜单,简单总结了一下用法:

1.在winform窗体中拖入treeview控件,注意修改属性CheckBoxes属性为true,即在节点旁显示复选框

2.后台动态加载数据库数据绑定到treeview上,子节点使用递归添加

代码如下:

//循环添加treeview节点

for (int i = ; i < dm.Rows.Count - ; i++)//dm是数据库查出的数据表

{

//添加父节点(一级菜单)

if (int.Parse(dm.Rows[i]["Menu_Type"].ToString()) == )

{

TreeNode pnode = new TreeNode();

pnode.Text = dm.Rows[i]["Menu_Text"].ToString();

pnode.Tag = int.Parse(dm.Rows[i]["Menu_ID"].ToString());

treeView1.Nodes.Add(pnode);

//调用方法,添加子级菜单

AddChildnode(int.Parse(dm.Rows[i]["Menu_ID"].ToString()), pnode);

}

}

添加子级菜单的方法如下:

public void AddChildnode(int mid, TreeNode pnode)

{

RoleHandle rh = new RoleHandle();

DataTable dm = rh.Menu_Texts_Type();

for (int i = ; i < dm.Rows.Count - ; i++)

{

if (int.Parse(dm.Rows[i]["Menu_Parent"].ToString()) == mid)

{

TreeNode cnode = new TreeNode();

cnode.Text = dm.Rows[i]["Menu_Text"].ToString();

cnode.Tag = int.Parse(dm.Rows[i]["Menu_ID"].ToString());

pnode.Nodes.Add(cnode);

//调用本方法,递归

AddChildnode(int.Parse(dm.Rows[i]["Menu_ID"].ToString()), cnode);

}

}

}

3.获取角色对应的权限,有权限则勾选,没有权限则不管

我同样封装了一个方法,方法代码如下:

private void RoleChanged()

{

RoleHandle rh = new RoleHandle();

int roleId = GetSelectedRoleId();

//循环遍历treeview1所有根节点

for (int i = ; i < treeView1.Nodes.Count; i++)

{

//查询数据库判断是否有该权限

if (rh.RoleMenuCheck(int.Parse(treeView1.Nodes[i].Tag.ToString()), roleId) != null && rh.RoleMenuCheck(int.Parse(treeView1.Nodes[i].Tag.ToString()), roleId).Rows.Count > )

{

//如果有权限,则勾选该节点

treeView1.Nodes[i].Checked = true;

}

else

{

treeView1.Nodes[i].Checked = false;

}

//调用递归的方法判断其子节点

TreeViewAllNodes(treeView1.Nodes[i], roleId);

}

}

判断子节点菜单是否有权限的方法(即判断子节点是否应勾选)

private void TreeViewAllNodes(TreeNode parentNode, int roleId)

{

RoleHandle rh = new RoleHandle();

foreach (TreeNode node in parentNode.Nodes)

{

if (rh.RoleMenuCheck(int.Parse(node.Tag.ToString()), roleId) != null && rh.RoleMenuCheck(int.Parse(node.Tag.ToString()), roleId).Rows.Count > )

{

node.Checked = true;

}

else

{

node.Checked = false;

}

if (node.Nodes.Count > )//如果该节点下还有子节点

{

//运用递归,调用改方法

TreeViewAllNodes(node, roleId);

}

}

}

4.使用鼠标单击treeview节点事件,实现点击某treeview节点时的子节点和父节点联动,代码如下:

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)

{

//判断该节点状态(展开或折叠)

if (nodestate)

{

TreeNode node = e.Node;

if (node.Nodes.Count > )//包含子节点,实现子级联动

{

//实现子级联动的方法

SetTreeViewChecked(node);

}

if (node.Parent != null)//有父级菜单,实现父级联动

{

//实现父级联动的方法

SetParentNodeState(node);

}

nodestate = false;//修改节点状态

}

}

子级联动的方法如下:

private void SetTreeViewChecked(TreeNode node)

{

if (node == null)

{

return;

}

if (node.Nodes.Count > )//判断该节点下有子节点

{

foreach (TreeNode item in node.Nodes)

{

item.Checked = node.Checked;

//调用该方法,递归

SetTreeViewChecked(item);

}

}

}

父级联动方法如下:

private void SetParentNodeState(TreeNode node)

{

//定义变量用来设置父节点的选中情况,bool ck = false;假设子节点为全不选情况

bool ck = false;

TreeNode pn = node.Parent;

if (pn != null)

{

//假设所有子节点为全未选,循环判断是否有子节点选中

foreach (TreeNode item in pn.Nodes)

{

//如果有一个子节点是选中的,ck=true;

if (item.Checked)

{

ck = true;

break;

}

}

if (ck)

{

pn.Checked = true;

}

else

{

pn.Checked = false;

SetParentNodeState(pn);//递归

}

}

}

补充说明一下,鼠标单击treeview节点事件有点坑,折叠或展开节点时也会触发该事件,所以我使用了TreeView1_AfterCheck事件解决了这个问题

//设置全局变量,用来接收节点的状态

private bool nodestate = false;

private void RoleMenuForm_Load(object sender, EventArgs e)

{

//在窗体加载事件中注册方法treeView1.AfterCheck

treeView1.AfterCheck += TreeView1_AfterCheck;

}

//treeView1.AfterCheck方法

private void TreeView1_AfterCheck(object sender, TreeViewEventArgs e)

{

//改变节点状态

nodestate = true;

}

Winform TreeView控件技巧

在开发的时候经常使用treeview控件来显示组织结构啊,目录结构啊,通常会结合属性checkedboxs,来做选中,取消的操作下面是一个选中,取消的小例子,选中节点的时候,如果节点存在子节点,可以选 ...

Winform - TreeView控件,只展开根目录

TreeNode类型是有Expand和ExpandAll这两个方法.而Treeview是只有ExpandAll的,想要展开根目录下面的节点的话 //只展开根目录 ) ].Expand();

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...

Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 &lpar;2012-07-16 13&colon;47&colon;07&rpar;转载▼

Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 ...

C&num;Winform中treeView控件使用总结

1.如何展开结点时改变图标(注意:不是选中时) 要在目录中使用图标首先要加入一个控件ImageList(命名为imageList1),然后可以按图片的index或名称引用图片. 然后需要在TreeVi ...

C&num; TreeView 控件的综合使用方法

1.概述 该篇文章开发使用的语言c#,环境visualstudio2010,sql数据库.主要内容包括: (1)treeView控件添加根节点.子节点的基本方法,节点的删除. (2)把treeView ...

C&num;编程,TreeView控件的学习

新建一个WinForm项目之后,在窗体中放入一个treeView控件(treeView1),根据数据库数据填充建立树节点.数据库的结构如下: ID        Title        P_ID a ...

如何:使用TreeView控件实现树结构显示及快速查询

本文主要讲述如何通过使用TreeView控件来实现树结构的显示,以及树节点的快速查找功能.并针对通用树结构的数据结构存储进行一定的分析和设计.通过文本能够了解如何存储层次结构的数据库设计,如何快速使用 ...

随机推荐

TCP&sol;IP协议与UDP协议的区别

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接.一个TCP连接必须要经过三次“对话”才能建立起来, ...

OC中如何把数组中字典的数据转换成URL&quest;

在使用objective-c语言开发iOS应用中,会向服务器通过URL请求一些数据,因此对URL的拼接肯定少不了.而在iOS中,我们一般是通过将字典中的数据拼接成我们要请求的URL字符串,那这个是怎么 ...

UVA 1252&Tab; 十五 Twenty Questions

十五 Twenty Questions Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

&lbrack;译&rsqb;MongoDB 3&period;0发布说明

原文来自:http://docs.mongodb.org/manual/release-notes/3.0/ 2015年3月3日 MongoDB 3.0现已可供使用.关键新特性包括支持WiredTig ...

基类和派生类--this

基类指针在程序运行的时候的确指向的是一个派生类的对象,但指针的类型仍然是基类指针.C++是一种强类型语言,因此不能用基类指针类型的指针直接调用派生类:而且,同一个类可能有多种不同的派生类,因此不知道实 ...

Eclipse添加Spket插件实现ExtJs智能提示

1 . 开发环境 MyEclipse 12.0.0 ExtJs 4.2.1.883 Spket 1.6.23 2 . 下载资源 extjs 4.2.1.883 - http://www.sencha. ...

Shell编程初步

一:Hello World 新建一个文件,命名时以 .sh 为后缀.每个bash文件开头第一行表名文件类型: #!/bin/bash 然后在下面输入代码. 比如输出hello world: #!/ ...

JavaScript运算符与类型

1.运算符优先级 首先讲一下运算符的优先级,它决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行. 下面的表将所有运算符按照优先级的不同从高到低排列: 优先级 运算类型 关联性 运算符 19 ...

c&plus;&plus;中类的静态数据成员

有时需要为某个类的所有对象分配一个单一的存储空间,这个存储空间只是被这个类的对象访问,其他人不能访问,那么这时静态的成员变量是有用的.例如下面用来统计一共创建了多少个对象的变量num class cl ...

hdu 5692&lpar;dfs序&plus;线段树&comma;好题&rpar;

Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页