zoukankan      html  css  js  c++  java
  • 一个无限级树结构配合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对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/dier/p/1208052.html
Copyright © 2011-2022 走看看