在上篇总结随笔《Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用》介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司、所属部门、直属经理(人员列表)的几级数据级联的展示,通过引入TreeListLookupEdit控件,能增强用户的体验效果。本篇继续介绍权限系统模块中的一些闪光点,介绍组织机构管理里面选择用户的界面设计和实现,用户选择在很多场合会用到,如组织机构的用户选择,角色里面的用户选择,或者流程里面的用户选择等用途。

1、选择用户界面效果展示

用户选择在很多地方需要用到,本篇以组织机构里面的用户选择为例,介绍用户选择的界面效果。我们知道,用户一般可以按组织机构进行分类,也可以按照角色进行分类,因此我们需要结合两者进行快速展示用户的层次关系,界面效果如下所示。

在上面的界面分为三个部分:左边主要是机构和角色的展示;右边则是通过列表控件进行展示,并可以进行勾选的操作;底部则是已选用户的列表展示(可以移除)。

2、左边机构树的递归展现

组织机构本身设计就是一个有层次关系的树,因此它可以通过递归函数进行展现,展示方式可以使用传统样式的TreeView控件或者DevExpress样式的TreeList控件,不过我倾向于使用TreeView,觉得这个线状的层次关系更美观一些,递归展示结构树的代码如下所示。

  1. private void InitDeptTree()
  2. {
  3. this.treeDept.BeginUpdate();
  4. this.treeDept.Nodes.Clear();
  5.  
  6. TreeNode node = new TreeNode();
  7. node.Text = "所有部门";
  8.  
  9. List<OUNodeInfo> list = BLLFactory<OU>.Instance.GetTree();
  10. AddDept(list, node);
  11.  
  12. this.treeDept.Nodes.Add(node);
  13. this.treeDept.ExpandAll();
  14. this.treeDept.EndUpdate();
  15. }
  16.  
  17. private void AddDept(List<OUNodeInfo> list, TreeNode treeNode)
  18. {
  19. foreach (OUNodeInfo ouInfo in list)
  20. {
  21. TreeNode deptNode = new TreeNode();
  22. deptNode.Text = ouInfo.Name;
  23. deptNode.Tag = ouInfo.ID;
  24. deptNode.ImageIndex = Portal.gc.GetImageIndex(ouInfo.Category);
  25. deptNode.SelectedImageIndex = Portal.gc.GetImageIndex(ouInfo.Category);
  26. treeNode.Nodes.Add(deptNode);
  27.  
  28. AddDept(ouInfo.Children, deptNode);
  29. }
  30. }

角色树不是一个递归的关系,因此只需要按列表展示即可,展示代码如下所示。

  1. private void InitRoleTree()
  2. {
  3. this.treeRole.BeginUpdate();
  4. this.treeRole.Nodes.Clear();
  5.  
  6. TreeNode node = new TreeNode();
  7. node.Text = "所有角色";
  8.  
  9. List<RoleInfo> list = BLLFactory<Role>.Instance.GetAll();
  10. foreach (RoleInfo info in list)
  11. {
  12. TreeNode roleNode = new TreeNode();
  13. roleNode.Text = info.Name;
  14. roleNode.Tag = info.ID;
  15. roleNode.ImageIndex = ;
  16. roleNode.SelectedImageIndex = ;
  17.  
  18. node.Nodes.Add(roleNode);
  19. }
  20.  
  21. this.treeRole.Nodes.Add(node);
  22. this.treeRole.ExpandAll();
  23. this.treeRole.EndUpdate();
  24. }

角色列表大概效果如下所示。

3、右边可勾选列表的实现

右边其实可以通过一般的GridView进行展示,但为了更好的封装和使用,我使用我的Winform分页控件中的WinGridview对象进行展示,这样使用起来更简便。

  1. public partial class FrmSelectUser : BaseForm
  2. {
  3. public FrmSelectUser()
  4. {
  5. InitializeComponent();
  6.  
  7. this.winGridView1.ShowCheckBox = true;
  8. this.winGridView1.ShowExportButton = false;
  9. this.winGridView1.ShowLineNumber = true;
  10. this.winGridView1.BestFitColumnWith = false;//是否设置为自动调整宽度,false为不设置
  11. this.winGridView1.OnRefresh += new EventHandler(winGridView1_OnRefresh);
  12. this.winGridView1.gridView1.DataSourceChanged += new EventHandler(gridView1_DataSourceChanged);
  13.  
  14. if (!this.DesignMode)
  15. {
  16. InitDeptTree();
  17. InitRoleTree();
  18. }
  19. }

绑定数据是通过左边的树进行条件检索的,因此可以通过获取组织机构或者角色的节点数据进行查询,我们通过判断组织机构树节点或者角色树节点是否选中来判断即可,具体列表绑定的代码如下所示。

  1. private void BindGridData()
  2. {
  3. List<UserInfo> list = new List<UserInfo>();
  4. if (this.treeDept.SelectedNode != null && this.treeDept.SelectedNode.Tag != null)
  5. {
  6. int ouId = this.treeDept.SelectedNode.Tag.ToString().ToInt32();
  7. list = BLLFactory<User>.Instance.FindByDept(ouId);
  8. }
  9. else if (this.treeRole.SelectedNode != null && this.treeRole.SelectedNode.Tag != null)
  10. {
  11. int roleId = this.treeRole.SelectedNode.Tag.ToString().ToInt32();
  12. list = BLLFactory<User>.Instance.GetUsersByRole(roleId);
  13. }
  14.  
  15. //entity
  16. this.winGridView1.DisplayColumns = "HandNo,Name,FullName,Title,MobilePhone,OfficePhone,Email,Gender,QQ,Note";
  17. this.winGridView1.ColumnNameAlias = BLLFactory<User>.Instance.GetColumnNameAlias();//字段列显示名称转义
  18.  
  19. this.winGridView1.DataSource = new WHC.Pager.WinControl.SortableBindingList<UserInfo>(list);
  20. }

单用户勾选列表的复选框的时候,该行的数据会被选中,我们最后要获取用户的勾选记录(通过WinGridview控件的GetCheckedRows方法获取),然后获取对应的数据,添加到关联关系的数据库即可,具体代码如下所示。

  1. private void btnAddUser_Click(object sender, EventArgs e)
  2. {
  3. List<int> list = this.winGridView1.GetCheckedRows();
  4. foreach(int rowIndex in list)
  5. {
  6. string ID = this.winGridView1.GridView1.GetRowCellDisplayText(rowIndex, "ID");
  7. string Name= this.winGridView1.GridView1.GetRowCellDisplayText(rowIndex, "Name");
  8. string FullName = this.winGridView1.GridView1.GetRowCellDisplayText(rowIndex, "FullName");
  9. string displayname = string.Format("{0}({1})", FullName, Name);
  10.  
  11. if (!this.SelectUserDict.ContainsKey(ID))
  12. {
  13. this.SelectUserDict.Add(ID, displayname);
  14. }
  15. }
  16.  
  17. RefreshSelectItems();
  18. }

4、用户选择结果的展示

在一些场景中,我们可能需要在多个组织机构和角色中选择不同的用户,为了更方便展示我们选中的记录,我设计了一个用户控件(一个删除按钮(Button)+标签控件(Lable))组合即可,如下所示。

由于我们选择的内容,无非就是选择它的人员名称即可,如果需要,单击删除按钮,让用户剔除不需要的人员,因此控件增加一个OnDeleteItem事件用来处理这个删除操作。

我们展示多个用户信息的时候,就是通过构造多个这样的控件,并动态增加到Panel里面即可,实现代码如下所示。

  1. /// <summary>
  2. /// 刷新选择信息
  3. /// </summary>
  4. private void RefreshSelectItems()
  5. {
  6. this.flowLayoutPanel1.Controls.Clear();
  7. foreach (string key in SelectUserDict.Keys)
  8. {
  9. string info = SelectUserDict[key];
  10. if (!string.IsNullOrEmpty(info))
  11. {
  12. UserNameControl control = new UserNameControl();
  13. control.BindData(key, info);
  14. control.OnDeleteItem += new UserNameControl.DeleteEventHandler(control_OnDeleteItem);
  15. this.flowLayoutPanel1.Controls.Add(control);
  16. }
  17. }
  18. this.lblItemCount.Text = string.Format("当前选择【{0}】项目", SelectUserDict.Keys.Count);
  19. }

5、最终的组织机构管理界面效果

在开篇说了,用户选择在很多场合会用到,如组织机构的用户选择,角色里面的用户选择,或者流程里面的用户选择等用途。

下面是组织机构里面的主体界面。

在右上角的包含用户区域,单击添加按钮,就会出现前面说到的用户选择对话框,如下所示。

Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计的更多相关文章

  1. Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用

    最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一个项目或者模块完成 ...

  2. Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

    在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...

  3. Winform开发框架之权限管理系统改进的经验总结(4)--用户分级管理

    在实际的系统应用环境中,用户的分级管理一般也是比较常见的功能,小的业务系统可以不需要,但是一般涉及到集团.分子公司.或者是事业单位里面的各个处室或者某某局的人员管理,这些分级管理就显得比较必要,否则单 ...

  4. Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现

    在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能.在一般权限系统里面,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统.本随笔主要介绍在我的权 ...

  5. Winform开发框架之权限管理系统的改进

    权限管理系统,一直是很多Mis系统和一些常见的管理系统所需要的,所以一般可以作为独立的模块进行开发,需要的时候进行整合即可,不需要每次从头开发,除非特殊的系统需求.我在Winform开发框架介绍中的随 ...

  6. Winform开发框架之权限管理系统

    本文章转载:http://www.cnblogs.com/wuhuacong/archive/2011/05/08/2040620.html 至此,权限管理模块介绍已经完毕,下面给出一个调用例子Dem ...

  7. Web开发框架之权限管理系统

    Web开发框架之权限管理系统 记得我在很早之前,开始介绍我的Winform开发框架和我的WCF开发框架之初,我曾经给出下面的视图,介绍我整理的一个框架体系,其中包含有WInform开发框架以及我的We ...

  8. Winform开发框架之权限管理系统功能介绍

    权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用.2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制.3) 多数据库架构支持,内置支持Sql ...

  9. ABP+AdminLTE+Bootstrap Table权限管理系统第十一节--Bootstrap Table用户管理列表以及Module Zero之用户管理

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 用户实体 用户实体代表应用的一个用户,它派生自AbpUser类,如下所示: public class User : ...

随机推荐

  1. Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp

    D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...

  2. elasticsearch-cn-out-of-box

    elasticsearch-cn-out-of-box https://github.com/hangxin1940/elasticsearch-cn-out-of-box 为elasticsearc ...

  3. 【css】ie6 和 ie7 下 position 与 overflow 的问题

    前几天做的项目中碰到这样一个问题,在 ie6 和 ie7 下,给父元素设置 overflow:hidden 不起作用无法隐藏,后来发现是子元素中有设置 position:relative,如果子元素删 ...

  4. 通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 解析办法

    EasyRadius提示:通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 出现以上问题,和easyradius没有直接的联系,主要产生原因有两种可能: 可能1:easyr ...

  5. Xcode 6 UITextField 键盘不弹出

    iOS Simulator -> Hardware -> Keyboard Uncheck "Connect Hardware Keyboard"

  6. 在SpringMVC中获取request对象的几种方式

    1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...

  7. git删除远程文件夹或文件的方法

    由于本地修改了文件夹大全名大小写的原因,同步到git上并不区分大小写,造成了一些文件同步不了,所以要先把git远程库上文件夹删除掉,然后再重新同步 如下,我把src里的全部移除,但是本地文件还保留. ...

  8. 如何改变Activity在当前任务堆栈中的顺序,Intent参数大全

    引用:http://blog.csdn.net/think_soft/article/details/7477072 本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activ ...

  9. SDL安全人员角色定义

    SDL安全人员角色定义 http://www.docin.com/p-819975580.html

  10. 多线程调用WebClient速度变慢的问题

    设置 System.Net.ServicePoint 对象所允许的最大并发连接数 System.Net.ServicePoint 对象允许的最大并发连接数.默认值为 2 System.Net.Serv ...