• 结合FlyTreeView 无限级别的分类


    刚刚看了一篇“无限级别的分类”的文章,地址:http://www.cnblogs.com/datasky/archive/2008/05/26/1207325.html
    所以来发个之前也是用在无限级树结构的用例,是用在组织架构上面的。不过基本上和上面提到的文章差不多。
    我觉得主要是想说说一些配合FlyTreeView实际上使用的例子来。

    表结构
    (用Department可能不太符合):
    CREATE TABLE Department
    (
        dept_id         INT             IDENTITY(1,1),  --部门编号
        dept_name       VARCHAR(50)     NOT NULL,       --部门名称
        dept_fullname   VARCHAR(1000)   NOT NULL,       --部门全称
        dept_level      INT             NOT NULL,       --部门级别(后来扩充)
        dept_code       VARCHAR(1000)   NOT NULL,       --部门轨迹
        dept_parent     INT             NOT NULL,       --上级部门
        dept_info       VARCHAR(200)    NULL,           --部门信息(后来扩充,觉得还是有必要的)
        dept_status     CHAR(1)         DEFAULT(1),     --部门状态(0:隐藏 1:正常 2:特殊 3:删除)
    )

    数据(省略字段中的dept_):
    id      name        fullname                 level       code    parent  info    status
    1       XX公司      XX公司                   1           0       0               1
    2       开发部      XX公司-开发部            2           0.2     1               1
    3       程序组      XX公司-开发部-程序组     3           0.2.3   2               1
    4       测试组      XX公司-开发部-测试组     3           0.2.4   2               1
    5       维护组      XX公司-开发部-维护组     3           0.2.5   2               1
    6       工程部      XX公司-工程部            2           0.6     1               1
    7       市场部      XX公司-市场部            2           0.7     1               1


    例子
    1、数据绑定
    FlyTreeView在一个节点上面可以绑几个数据,具体如下:
    Key       ->  dept_id
    Name      ->  dept_name
    Parent    ->  dept_parent
    Data      ->  dept_level
    ToolTips  ->  dept_fullname

    一般情况下,管理是绑着整个组织架构的所有节点,如下:
    FlyTreeView1.DataBind();
    如果是部门管理员的话,那么可能只能维护自己部门下的节点,如下:
    FlyTreeView1.DataBind( EMP.deptId );

    这样子,FlyTreeView就会自动帮你绑好整个树。:)
    加上部门全称原因有几个:
    1.当鼠标移至树控件上面时显示
    2.有些情况需要显示员工部门的全称。
    3.可避免在同名部门时,不能从名称上看出他是哪的。(多个分公司,都有开发部)
    而轨迹是为了查询和修改等,后面会说到。这也是无限级树结构所必须的。


    2、新增部门
    在FlyTreeView上,选择了一个节点,往其添加子节点,如下:
    string newName = txtName.Text;
    string deptId = FlyTreeView1.SelectedNode.Key;
    string deptCode = FlyTreeView1.SelectedNode.Data;
    string deptFName = FlyTreeView1.SelectedNode.ToolTips;
    先INSERT个新的节点,然后UPDATE一下全称和轨迹等信息,这个应该没什么问题吧?跳过。


    3、修改部门
    这里有两种情况:
    (1)改部门名称
    这个涉及到修改自身部门的信息和更新所有下级部门的全称等。
    string deptId = FlyTreeView1.SelectedNode.Key;
    string deptCode = FlyTreeView1.SelectedNode.Data;
    string oldName = ViewState["DEPT_NAME"].ToString();
    string newName = txtName.Text;

    第一步,更新自己:
    UPDATE Department SET dept_name = '[newName]', dept_fullName = REPLACE(dept_fullName,'[oldName]','[newName]')
    WHERE dept_id=[deptId]

    第二步,更新所有子部门:
    UPDATE Department SET dept_fullName = REPLACE(dept_fullName,'[oldName]','[newName]')
    WHERE dept_code LIKE '[deptCode]%'

    (备注:上面的SQL中加中括号的表示程序中的变量,只是为了方便看。下面例子也同样使用这种方法表示。)
    在更新子节点的时候,就可以理解记录轨迹的重要性了。不管有几级的子节点,都可以一次性更新掉。:)

    (2)转移部门到其它部门下面,或者一个组成立一个新部门
    例如上面的测试数据,需要将开发部下面的维护组成立一个新的部门。
    string newParentId = ddlDept.SelectedValue;
    string newName = "维护部";
    string deptId = FlyTreeView1.SelectedNode.Key;
    string deptCode = FlyTreeView1.SelectedNode.Data;
    string deptFName = FlyTreeView1.SelectedNode.ToolTips;

    第一步,找到新的上级部门的信息
    SELECT * FROM Department WHERE dept_id = [newParentId]

    第二步,更新自己(假设上面结果得到对象newParent)
    UPDATE Department SET dept_name = '[newName]', dept_fullname = '[newParent.dept_fullname]' + '-' + '[newName]', dept_code = '[newParent.dept_fullname]' + '.' + '[newName]'
    WHERE dept_id = [deptId]

    第三步,更新子部门
    还是用REPLACE()函数,把旧的部门全称和部门轨迹给替换成新的,这个就不写了。(偷懒一下)


    4、查询
    这个是比较常用的,用途也很多,下面举一些比较常碰到的例子。
    (1)查询某部门的所有子部门,如下:
    string deptCode = FlyTreeView1.SelectedNode.Data;
    SELECT * FROM Department WHERE dept_code LIKE '[deptCode]%'

    (2)查询某级别的部门,这个常在列出所有子公司或者所有一级部门时用到。如下:
    SELECT * FROM Department WHERE dept_level = 2

    (3)查询某个级别的归属,这个其实全称就可以看出来了,不过有时会需要所有数据。如下:
    string deptCodes = FlyTreeView1.SelectedNode.Data.Replace(".",",");
    SELECT * FROM Department WHERE dept_id in ([deptCodes]) ORDER BY dept_level;

    (4)找上级部门(这个是废话)
    string deptParent = FlyTreeView1.SelectedNode.Parent;
    SELECT * FROM Department WHERE dept_id = [deptParent]

    5、展开树
    这个是专为FlyTreeView为说的,有时候我们想在界面上展开某一个节点。
    FlyTreeView1.ExpandNodes = dept_code.Split('.');

    6、限制级别层数
    有时候又需要限制一下最多有几层,这个时候可以用dept_level来判断。
    如果是在树控件上的话,那么 FlyTreeView1.SelectedNode.Data.Split('.').Length 就可以得到。

    OK,差不多就介绍这些吧。
    其实上面的例子还是不能完成一个任务,那就是排序。
    由于组织架构可能不会涉及到排序的问题,所以当初设计的时候没有考虑进去。
    不知道在FlyTreeView上能否实现排序?望达人指点。

  • 相关阅读:
    全面解释java中StringBuilder、StringBuffer、String类之间的关系
    如何解决Java.lang.NoClassDefFoundError--第一部分
    Java中Vector和ArrayList的区别
    深入研究java.lang.ThreadLocal类
    Frame.pack()与frame.validate()方法的区别
    Oracle中start with...connect by子句的用法
    Java 的swing.GroupLayout布局管理器的使用方法和实例
    Java SE 6.0实现高质量桌面集成开发
    苹果App Store开发者帐户从申请,验证,到发布应用(2)
    苹果App Store开发者帐户从申请,验证,到发布应用(1)
  • 原文地址:https://www.cnblogs.com/chengulv/p/1290381.html
Copyright © 2020-2023  润新知