做角色菜单权限时用到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控件使用的更多相关文章

  1. Winform TreeView控件技巧

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

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

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

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

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

  4. HTTP模拟工具【C#/Winform源码】、Json绑定TreeView控件、使用了MetroModernUI、RestSharp、Dapper.Net、Newtonsoft.Json、SmartThreadPool这几个主要开源框架

    HTTP模拟工具 开发语言:C#/Winform开发工具:Visual Studio 2017数据库:   SQLite使用框架:界面-MetroModernUI              Http请 ...

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

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

  6. C#Winform中treeView控件使用总结

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

  7. C# TreeView 控件的综合使用方法

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

  8. C#编程,TreeView控件的学习

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

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

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

随机推荐

  1. attention机制的实现

    本文转自,http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! LSTM 中实现attention:https://distil ...

  2. git 无法忽略Android Studio 生成的 .idea目录解决办法

    在Android Studio中导入了别的人Gradle项目,产生了 .idea文件夹, 然后git 发现了这个变动,修改了 .gitignore不起作用,仍然不能忽略这个文件夹 在项目目录里面 右键 ...

  3. matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  4. MongoDB数据库 备份 还原

    MongoDB数据库 1.备份用        mongodump 2.还原用        mongorestore 1.备份 @echo offecho 正在备份MongoDB数据库SET mon ...

  5. raw_input与input的区别

    1. 版本差异 raw_input——>python2版本 input——>python3版本 2. 输入格式差异 就是raw_input()随便输都是字符串,而input()必须按照Py ...

  6. 诊断GRID无法启动问题

    诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)

  7. 加深理解HTTP请求---网络基础TCP/IP

    为了了解HTTP,必须的了解TCP/IP协议族. 通常使用的网络实在TCP/IP协议族的基础上运作的.而HTTP就属于他的一个子集. 1.TCP/IP 协议族 计算机与网络设备要相互通信,双方就必须基 ...

  8. angularjs filter详解

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果. 主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等. ng内置了一些过滤器, ...

  9. 布局方式-inline-block布局

    .像文本一样排block元素 .没有清除浮动等问题 .需要处理间隙     一种方式 <style> .container{ width: 800px; height: 200px; fo ...

  10. PHP面试题分享与答案

    由于之前的每一个问题都是一个比较大的知识点,作者希望可以尽量一一详细解答,如果有不足的地方欢迎大家补充和修改,同时借鉴牛人写的Mysql中算法的实现以及内存原理,Btree结构等. 1:MySQL数据 ...