做角色菜单权限时用到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. HTML标签 链接 随笔3

    4-1 <a>标签  网页链接 使用<a>标签可实现超链接,它在网页制作中可以说是无处不在,只要有链接的地方,就会有这个标签. 语法: <a href="目标网 ...

  2. bootstrap模态框实现相对定位拖拽

    1.正常的拖拽是用绝对定位absolute来实现的,可是bootstrap的模态框是用relative,为了统一更改方便,就照着相对定位来实现拖拽效果. $(".modal .modal-h ...

  3. iPython与notebook的基本用法

    1 Ipython 安装 pip install ipython 2 Notebooke 基本用法 启动ipython使用ipython 启动notebook 使用 ipython notebook ...

  4. 在linux环境下搭建java web测试环境(非常详细!)

    一.项目必备软件及基本思路 项目必备:虚拟机:VMware Workstation (已安装linux的 CentOS6.5版本) 项目:java web项目 (必须在本地部署编译后选择项目的webR ...

  5. 转:C函数调用理解

    1 空函数 int main() { 00411360 push ebp ;压入ebp 00411361 mov ebp,esp ;ebp = esp,保留esp,待函数调用完再恢复,因为函数调用中肯 ...

  6. Windows 消息框架: SDK教程

    关键字:WindowsSDK 消息机制 http://www.codeproject.com/Articles/599/Windows-Message-Handling-Part-3 Handling ...

  7. Visual Studio 快捷键汇总

    常见方法: 强迫智能感知:Ctrl+J.智能感知是Visual Studio最大的亮点之一,选择Visual Studio恐怕不会没有这个原因.  撤销:Ctrl+Z.除非你是天才,那么这个快捷键也是 ...

  8. sqlserver broker远端端点证书认证

    1:采用windows验证的方法: CREATE ENDPOINT InstInitiatorEndpoint STATE = STARTED AS TCP ( LISTENER_PORT = ) F ...

  9. day014-反射、注解

    1. Junit 1.1什么是Junit Junit是Java语言编写的第三方单元测试框架(工具). 1.2单元测试 在Java中,一个类就是一个单元. 单元测试:开发中编写的一小段代码,用来检测类中 ...

  10. python下的selenium安装

    安装python 打开 Python官网,找到“Download”, 在其下拉菜单中选择自己的平台(Windows/Mac),一般的Linux平台已经自带的Python,所以不需要安装,通过打开“终端 ...