none
如何根据登录用户所在的部门展开树!(十万火急) RRS feed

  • 问题

  • 各位大虾:
        明天要交项目了,现在有个问题一直没搞定,就是除了当前登录用户所在的部门树展开以外,其它的部门不展开,请问如何实现阿?最好有源码,谢谢!
    2009年4月16日 9:46

答案

  • 你的情况,可能是在根节点调用了ExpandAll(),你把 ExpandAll 换成 Expand()

    private void Form_Load(object sender, EventArgs e)
            {
                TreeView fTreeView = new TreeView();
    
                TreeNode fTreeNode0 = new TreeNode("A0");
                TreeNode fTreeNode1 = new TreeNode("A1");
                TreeNode fTreeNode2 = new TreeNode("A2");
                TreeNode fTreeNode3 = new TreeNode("A3");
                TreeNode fTreeNode4 = new TreeNode("A4");
                TreeNode fTreeNode5 = new TreeNode("A5");
    
                BuildNodes(fTreeNode1.Nodes);
                BuildNodes(fTreeNode2.Nodes);
                BuildNodes(fTreeNode3.Nodes);
                BuildNodes(fTreeNode4.Nodes);
                BuildNodes(fTreeNode5.Nodes);
    
                fTreeNode0.Nodes.Add(fTreeNode1);
                fTreeNode0.Nodes.Add(fTreeNode2);
                fTreeNode0.Nodes.Add(fTreeNode3);
                fTreeNode0.Nodes.Add(fTreeNode4);
                fTreeNode0.Nodes.Add(fTreeNode5);
    
                fTreeView.Nodes.Add(fTreeNode0);
                fTreeView.Dock = DockStyle.Fill;
                this.Controls.Add(fTreeView);
    
                fTreeView.Nodes[0].Expand();
                fTreeNode4.Expand();
                fTreeNode4.ExpandAll();
            }
    
            private void BuildNodes(TreeNodeCollection fConnection)
            {
                for (int i = 0; i < 5; i++)
                    fConnection.Add(i.ToString());
            }




    知识改变命运,奋斗成就人生!
    2009年4月19日 14:25
    版主

全部回复

  • TreeNode,有Expand() 方法 你只需要遍历 TreeView的所有 TreeNode判断哪个TreeNode 是当前用户所在的部门,然后再执行 TreeNode.Expand()

    知识改变命运,奋斗成就人生!
    2009年4月16日 9:54
    版主
  • 谢谢楼上的答复,但是我确实是这样写了,但是不行。
    2009年4月16日 9:56
  • 什么效果
    知识改变命运,奋斗成就人生!
    2009年4月16日 9:56
    版主
  • 这个问题是应该间比较简单的,上面的方法应该是可以的,可能是具体细节上有问题, 是把你的代码贴出来大家帮你看看
    知识改变命运,奋斗成就人生!
    2009年4月16日 9:58
    版主
  • 如果所有部门的树节点都展开到第二级的话,那么当前登录用户所在的部门才能完全展开,如果只展开第一级话,整个树都展不开。如:
      xxxxx单位
         财务部
              出纳
         运行部
              信息中心
              工程分部
         检修部
              检修分部

    如果像上面所示树展开到第二级的话,那么当前登录的用户所在的部门才能完全展开如下:
      xxxxx单位
         财务部
              出纳
         运行部
              信息中心
              工程分部
                   仪表班
                        汽化组
         检修部
              检修分部

    其实我想要的效果是这样的(假设当前登录用户属于汽化组)
       xxxxx单位
         财务部
         运行部
              信息中心
              工程分部
                   仪表班
                        汽化组
         检修部
        
    2009年4月16日 10:04
  • 根的那个TreeNode.Expand()
    运行部那个TreeNode.Expand() 就行了
    知识改变命运,奋斗成就人生!
    2009年4月16日 10:06
    版主
  • 不行啊,以下是我的源代码,请大家帮忙,谢谢!
       //判断节点并收缩
        protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
        {
            if (TreeView1.SelectedNode == null)
            {
                TreeNodeCollection ts = null;
                if (e.Node.Parent == null)
                {
                    ts = ((TreeView)sender).Nodes;
                }
                else
                {
                    ts = e.Node.ChildNodes;
                }
                foreach (TreeNode node in ts)
                {
                    if (Session["Dment_No"] != null)
                    {
                        string Dment_No = Session["Dment_No"].ToString();
                        string nodeSV = node.Value;
                        if (Dment_No == "admin")
                        { }
                        if (nodeSV == "1")
                        { }
                        if (Dment_No != nodeSV && nodeSV != "1")
                        { 
                            node.CollapseAll();
                        }
                        if (Dment_No == nodeSV)
                        {
                            Font f1 = new Font("宋体", 12);
                            Font f = new Font("宋体", 14, FontStyle.Bold);
                            node.Text = "<b>" + node.Text + "</b>";
    
                            node.ExpandAll();
                        }
                    }
                }
            }
        else {
                TreeView1.SelectedNode.ExpandAll();
            }
    
        }
    }
    
    2009年4月17日 0:43
  • TreeNode下面除了 ExpandAll() 方法 还有个 Expand()方法 是不是这个的问题啊?

    2009年4月19日 13:36
  • 其它节点不要调用展开的方法,只有这两个节点调用
    知识改变命运,奋斗成就人生!
    2009年4月19日 13:41
    版主
  • 楼主,你好,请注意,TreeNode,是嵌套的,需要遍历嵌套遍历,一次遍历,只遍历了一层!
    jon.valett@gmail.com
    2009年4月19日 14:06
    版主
  • 你的情况,可能是在根节点调用了ExpandAll(),你把 ExpandAll 换成 Expand()

    private void Form_Load(object sender, EventArgs e)
            {
                TreeView fTreeView = new TreeView();
    
                TreeNode fTreeNode0 = new TreeNode("A0");
                TreeNode fTreeNode1 = new TreeNode("A1");
                TreeNode fTreeNode2 = new TreeNode("A2");
                TreeNode fTreeNode3 = new TreeNode("A3");
                TreeNode fTreeNode4 = new TreeNode("A4");
                TreeNode fTreeNode5 = new TreeNode("A5");
    
                BuildNodes(fTreeNode1.Nodes);
                BuildNodes(fTreeNode2.Nodes);
                BuildNodes(fTreeNode3.Nodes);
                BuildNodes(fTreeNode4.Nodes);
                BuildNodes(fTreeNode5.Nodes);
    
                fTreeNode0.Nodes.Add(fTreeNode1);
                fTreeNode0.Nodes.Add(fTreeNode2);
                fTreeNode0.Nodes.Add(fTreeNode3);
                fTreeNode0.Nodes.Add(fTreeNode4);
                fTreeNode0.Nodes.Add(fTreeNode5);
    
                fTreeView.Nodes.Add(fTreeNode0);
                fTreeView.Dock = DockStyle.Fill;
                this.Controls.Add(fTreeView);
    
                fTreeView.Nodes[0].Expand();
                fTreeNode4.Expand();
                fTreeNode4.ExpandAll();
            }
    
            private void BuildNodes(TreeNodeCollection fConnection)
            {
                for (int i = 0; i < 5; i++)
                    fConnection.Add(i.ToString());
            }




    知识改变命运,奋斗成就人生!
    2009年4月19日 14:25
    版主
  • 谢谢楼上的答复,但是还是不行,你这仅仅是增加二级目录
    2009年4月22日 7:54
  • 其实原理都是一样的,你可以发个新贴把关于树处理的代码贴出来自己然有很多朋友帮你解决
    知识改变命运,奋斗成就人生!
    2009年4月22日 7:56
    版主
  • 各位大虾:
        我希望能够实现除了当前登录用户所在的部门班组树展开以外,其它部门的树收起来。我现在只能实现所有的树都展开到第二节点时才能展开当前登录用户所在部门班组的树,如果其它部门班组不展开到第二级的话,我所有的树都不能展开,请问如何处理阿?最好有源码,谢谢! 我的代码如下:
     //判断节点并收缩
        protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
        {
            if (TreeView1.SelectedNode == null)
            {
                TreeNodeCollection ts = null;
                if (e.Node.Parent == null)
                {
                    ts = ((TreeView)sender).Nodes;
                }
                else
                {
                    ts = e.Node.ChildNodes;
                }
                foreach (TreeNode node in ts)
                {
                    if (Session["Dment_No"] != null)
                    {
                        string Dment_No = Session["Dment_No"].ToString();
                        string nodeSV = node.Value;
                        if (Dment_No == "admin")
                        { }
                        if (nodeSV == "1")
                        { }
                        if (Dment_No != nodeSV && nodeSV != "1")
                        { 
                            node.CollapseAll();
                        }
                        if (Dment_No == nodeSV)
                        {
                            Font f1 = new Font("宋体", 12);
                            Font f = new Font("宋体", 14, FontStyle.Bold);
                            node.Text = "<b>" + node.Text + "</b>";
    
                            node.ExpandAll();
                        }
                    }
                }
            }
        else {
                TreeView1.SelectedNode.ExpandAll();
            }
    
        }
    }
    
    2009年4月29日 2:25
  • 各位大虾:
        我希望能够实现除了当前登录用户所在的部门班组树展开以外,其它部门的树收起来。我现在只能实现所有的树都展开到第二节点时才能展开当前登录用户所在部门班组的树,如果其它部门班组不展开到第二级的话,我所有的树都不能展开,请问如何处理阿?最好有源码,谢谢! 我的代码如下:

     //判断节点并收缩
        protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
        {
            if (TreeView1.SelectedNode == null)
            {
                TreeNodeCollection ts = null;
                if (e.Node.Parent == null)
                {
                    ts = ((TreeView)sender).Nodes;
                }
                else
                {
                    ts = e.Node.ChildNodes;
                }
                foreach (TreeNode node in ts)
                {
                    if (Session["Dment_No"] != null)
                    {
                        string Dment_No = Session["Dment_No"].ToString();
                        string nodeSV = node.Value;
                        if (Dment_No == "admin")
                        { }
                        if (nodeSV == "1")
                        { }
                        if (Dment_No != nodeSV && nodeSV != "1")
                        { 
                            node.CollapseAll();
                        }
                        if (Dment_No == nodeSV)
                        {
                            Font f1 = new Font("宋体", 12);
                            Font f = new Font("宋体", 14, FontStyle.Bold);
                            node.Text = "<b>" + node.Text + "</b>";
    
                            node.ExpandAll();
                        }
                    }
                }
            }
        else {
                TreeView1.SelectedNode.ExpandAll();
            }
    
        }
    }
    
    2009年4月29日 2:40
  • 这样的功能需要数据库的支持,数据库的表需要有个字段,保存每个节点的路径。也就是是以id为数据的路径。样子类似这样
    /1/43/567/33546/
    里面的数据分别代表父路径的id,这样,就可以根据这个参数,从根开始展开
    【孟子E章】
    2009年4月29日 12:42
    版主
  • 你设置节点的node.Expanded  = true就可以了吧
    【孟子E章】
    2009年4月29日 12:50
    版主
  • 你好,你参考一下我的代码

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.BuildDirectoryTree(this.TreeView1.Nodes, Guid.Empty);
            }
        }
    
        private void BuildDirectoryTree(TreeNodeCollection fNodes, Guid fParentDirectoryKey)
        {
            foreach (TreeDataSet.DirectoryRow fDirectoryRow
                in TreeManager.TreeDataSet.Directory.Select(string.Format("ParentDirectoryKey = '{0}'", fParentDirectoryKey)))
            {
                TreeNode fNode = new TreeNode();
                fNode.Expanded = false;
                fNode.Text = fDirectoryRow.Name;
                fNodes.Add(fNode);
    
                if (fNode.Text == "Credentials") // 这个判断改成判断部门
                {
                    TreeNode t = fNode;
                    while (t != null)
                    {
                        t.Expand();
                        t = t.Parent;
                    }
                }
    
                this.BuildDirectoryTree(fNode.ChildNodes, fDirectoryRow.DirectoryKey);
            }
        }


    知识改变命运,奋斗成就人生!
    2009年4月29日 14:42
    版主