做角色菜单权限时用到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控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼
Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 …
C#Winform中treeView控件使用总结
1.如何展开结点时改变图标(注意:不是选中时) 要在目录中使用图标首先要加入一个控件ImageList(命名为imageList1),然后可以按图片的index或名称引用图片. 然后需要在TreeVi …
C# TreeView 控件的综合使用方法
1.概述 该篇文章开发使用的语言c#,环境visualstudio2010,sql数据库.主要内容包括: (1)treeView控件添加根节点.子节点的基本方法,节点的删除. (2)把treeView …
C#编程,TreeView控件的学习
新建一个WinForm项目之后,在窗体中放入一个treeView控件(treeView1),根据数据库数据填充建立树节点.数据库的结构如下: ID Title P_ID a …
如何:使用TreeView控件实现树结构显示及快速查询
本文主要讲述如何通过使用TreeView控件来实现树结构的显示,以及树节点的快速查找功能.并针对通用树结构的数据结构存储进行一定的分析和设计.通过文本能够了解如何存储层次结构的数据库设计,如何快速使用 …
随机推荐
TCP/IP协议与UDP协议的区别
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接.一个TCP连接必须要经过三次“对话”才能建立起来, …
OC中如何把数组中字典的数据转换成URL?
在使用objective-c语言开发iOS应用中,会向服务器通过URL请求一些数据,因此对URL的拼接肯定少不了.而在iOS中,我们一般是通过将字典中的数据拼接成我们要请求的URL字符串,那这个是怎么 …
UVA 1252 十五 Twenty Questions
十五 Twenty Questions Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi …
[译]MongoDB 3.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++中类的静态数据成员
有时需要为某个类的所有对象分配一个单一的存储空间,这个存储空间只是被这个类的对象访问,其他人不能访问,那么这时静态的成员变量是有用的.例如下面用来统计一共创建了多少个对象的变量num class cl …
hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub …
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220006.html原文链接:https://javaforall.net
