|
根据登陆者id和用户类型,跨数据库关联三表,构建个人独立通迅录树 creAddressTree
alter proc sp_creAddressTree @userid varchar(14),@usertype varchar(1)
as
begin
declare @i int --循环计数器
declare @rowCount int
declare @menu varchar(20)
IF OBJECT_ID(N'tempdb..#tempTree', N'U') IS NOT NULL
drop table #tempTree
CREATE TABLE #tempTree(id int identity(1,1) not null,pid int default((0)) not null ,menu varchar(20) not null,type int null,connectid varchar(14) null)
if (@usertype = '2')
insert into #tempTree(pid,menu,type) values ( '0','部门联系人','0')
--
--自定义组名 [作为父结点]
set @i = 0
select @rowCount= max (id) from tb_usergroup
while @i < @rowCount
begin
if exists(select id from tb_usergroup where userid =@userid and id =@i+1)
begin
select @menu= groupname from tb_usergroup where id =@i+1
insert into #tempTree(pid,menu,type) values ( '0',@menu,'0')
end
set @i = @i+1
end
insert into #tempTree(pid,menu,type) values ( '0','添加',3)
declare @pid int
declare @connectid int
declare @connectname varchar(20)
--部门联系人
--查找对应部门,所有员工姓名作为结点
if (@usertype = '2') --部门人员
begin
set @i = 0
declare @depid int
select @rowCount = max(id) from smartregionmanager..tb_epinfor
select @depid=branchid from smartregionmanager..tb_epinfor where epid = @userid
while @i <@rowCount
begin
if exists (select * from smartregionmanager..tb_epinfor where id =@i+1 and epid <> @userid and branchid = @depid)
begin
select @connectid = id,@connectname =epname from smartregionmanager..tb_epinfor where id =@i+1 and epid <> @userid and branchid = @depid
insert into #tempTree(pid,menu,type,connectid ) values ( '1',@connectname,'1',@connectid )
end
set @i = @i+1
end
end
--用户自定义联系人
set @i = 0
select @rowCount= max (id) from tb_addresslist
while @i <@rowCount
begin
if exists(select id from tb_addresslist where userid =@userid and id =@i+1)
begin
select @menu= groupname ,@connectid = id,@connectname =name from tb_addresslist where id =@i+1
select @pid = id from #tempTree where menu =@menu and pid ='0'
insert into #tempTree(pid,menu,type,connectid ) values ( @pid,@connectname,'2',@connectid )
end
set @i = @i+1
end
select * from #tempTree
end
////部分代码:
#region 创建导航树 (三层)
private void Navigation(string uid,int utype)
{
dataTable = GetCategorys(uid,utype); ///取得本用户对应树的数据集 DT
tvgroup.Nodes.Clear();
TreeNode rootNode = new TreeNode();
rootNode.Text = "我的联系人";
tvgroup.Nodes.Add(rootNode);
DataRow[] rowList = dataTable.Select("pid=0");
if (rowList.Length <= 0) return;
foreach (DataRow row in rowList)
{
TreeNode chNode = new TreeNode();
chNode.Text = row["menu"].ToString();
chNode.Value = row["id"].ToString();
rootNode.ChildNodes .Add(chNode);
childNode (chNode ,chNode .Value );
}
}
private void childNode(TreeNode Node, string pid)
{
DataRow[] rowList = dataTable.Select("pid=" + pid);
if (rowList.Length <= 0) return;
foreach (DataRow row in rowList)
{
TreeNode node = new TreeNode();
node.Text = row["menu"].ToString();
node.Value = row["connectid"].ToString();
Node.ChildNodes.Add(node);
}
}
#endregion
#region 展开当前结点,收缩其它结点
protected void tvgroup_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
{
TreeNodeCollection ts = null;
if (e.Node.Parent == null)
{
ts = ((TreeView)sender).Nodes;
}
else
ts = e.Node.Parent.ChildNodes;
foreach (TreeNode node in ts)
{
if (node != e.Node)
{
node.Collapse();
}
}
}
#endregion
#region 用户选择联系人
protected void tvgroup_SelectedNodeChanged(object sender, EventArgs e)
{
TreeNode tn = new TreeNode();
tn = tvgroup.SelectedNode;
if (tn.ChildNodes.Count != 0)//如果是父亲结点
{
//tn.ToggleExpandState();//切换
tn.Collapse();
tn.Selected = false;
}
else
{
tn.Selected = true;
if (tn.Value != null)
{
BindPersonal(tn.Value); ///绑定联系人信息
}
}
}
#endregion
相关:
#region 递归创建嵌套树:
protected void Page_Load(object sender, EventArgs e)
{
//string userMenu = Request.Params[" "].ToString();
dataTable = GetCategorys("smartmanager",2);
tvgroup .Nodes.Clear();
TreeNode rootNode = new TreeNode ();
rootNode.Text = "我的联系人";
tvgroup .Nodes .Add(rootNode);
Navigation(rootNode, "0");
}
private void Navigation(TreeNode Node,string pid)
{
DataRow[] rowList = dataTable.Select("pid=" + pid);
if (rowList.Length <= 0) return;
foreach (DataRow row in rowList)
{
TreeNode rootNode = new TreeNode();
rootNode.Text = row["menu"].ToString();
rootNode.Value = row["id"].ToString();
Node.ChildNodes .Add(rootNode);
Navigation (rootNode ,rootNode .Value );
}
}
#endregion
#tempTree 临时表中:
------pid: 父节点
------menu:菜单名
------type: [ 0 :组名; 1 :所在部门人员 ; 2 :自定义联系人; 3 :功能键 (+添加组/联系人) ]
------connectid: [所有父节点取值为:Null , 第二层子节点取值为 联系人id ]
哈哈,有史以来最长的一个存储过程,构思了半天,花了四个小时终于搞定, 效率??
|