刚刚看了一篇“无限级别的分类”的文章,地址: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上能否实现排序?望达人指点。