我用的是ms treeview,察看了一下treenode 属性,没有visible这个属性
不知道牛人们怎么解决的,请教,急

解决方案 »

  1.   

    在数据库里新建一个表,然后将treeView的成员添加在这个表里面,更具不同的权限读取不同的记录
    然后,在生成树就可以了!
      

  2.   

    也可以通过一个类 的判断Session .的权限.通过读取你需要的TreeNode.不通过不读取
      

  3.   

    to kenMoxi
    你的办法太死板不行,我有1000个用户,20个权限,每个人访问一次,你给我动态生成一次?我10个人同时访问,你生成谁的???
      

  4.   

    kenMoxi(薪水一点,事儿一堆)  的方法完全正确,用一个表来记录用户访问的权限,这样,当某个用户浏览时,根据选出的用户权限列表显示用户的树,这样很方便,完全不要去对treeview做处理  “每个人访问一次,你给我动态生成一次?我10个人同时访问,你生成谁的???”  
       这句话很有问题,我不知道你怎么理解web的,只要不是同一台客户端机器,就有不同的session值,怎么可能会有所谓的“不知道生成谁的呢”?建议你还是先搞清楚b/s模式。
      

  5.   

    如果是windows应用程序 kenMoxi 的方法当然是正确的,但是对于B/S网页来说,大家访问的是同一个ASP.NET文件,不知道那个同志玩过ASP.NET的TREEVIEW控件没有,treeview的结构是现在文件中写好了,既然是大家共享访问的文件,自然是不能为某个用户动态生成的,那么“更具不同的权限读取不同的记录然后,在生成树就可以了!”又从何说起呢?
      

  6.   

    楼上说的有道理,不过我建议你对于不同的用户使用不同的xml,用xml来提添充 你的treeview
      

  7.   

    kenMoxi(薪水一点,事儿一堆) ( ) 的思路是正确的,用动态生成权限树的方法实现。
    举例说明,数据库建表如下
    树表(TreeID TreeName ParentID )。
    权限表(Account, Right)
        
    每个树节点都有一个自己的节点编号,同时有一个父节点编号。每个用户能够访问的树节点权限用一条记录保存他能够访问的节点编号在Right字段中。用户通过Account访问时,通过查找Right字段保存的节点编号,动态生成该权限树。
      

  8.   

    还有:
          <ie:TreeView runat="server" SystemImagesPath="/webctrl_client/1_0/treeimages" >
            <ie:TreeNode Text="North America" ImageUrl="/webctrl_client/1_0/images/root.gif" 
              Expanded="true" TreeNodeSrc="state_city.xml" />
          </ie:TreeView>
    可以把每个子树写成一个xml文件,再根据权限动态装入,没有该权限的就不装入,就可以了
    asp.net的treeview和treenode中,没有isvisible 这个属性的
      

  9.   

    myoldsaturn(saturn) 说法完全错误。
    treeview的结构现在文件中写好,这是静态使用treeview的方法。根本没有了解动态生成树控件的原理和方法,当然只有这么理解。
      

  10.   

    myoldsaturn(saturn) 不知道你怎么做程序的,treeview完全可以动态生成,哪需要“先在文件中写好”?
    难道你写的C/S都是给每个用户写一个菜单,你的客户需要10种权限,你就写10套系统吗?
      

  11.   

    qiangsheng(代码工人):拜托看清楚点
    “如果是windows应用程序 kenMoxi 的方法当然是正确的,但是对于B/S网页来说,大家访问的是同一”
      

  12.   

    还有,是ASP.NET不是.NET中实现的?
      

  13.   

    myoldsaturn(saturn),如果你不知道怎么做,就不要反复强调你的错误观点。
    你还没真正了解b/s模式。但是对于B/S网页来说,大家访问的是同一,虽然是同一,但是用户不一样,生成界面不一样,先了解什么是动态绑定。
      

  14.   

    我已经将思路说明了:举例说明,数据库建表如下
    树表(TreeID TreeName ParentID )。
          1      工资管理  0
          2       某部门工资管理 1
          3      资料管理  0
        。先建成树表           权限表(Account, Right)
            admin     1,2,3
            xxx       3  
        
    每个树节点都有一个自己的节点编号,同时有一个父节点编号。每个用户能够访问的树节点权限用一条记录保存他能够访问的节点编号在Right字段中。用户通过Account访问时,通过查找Right字段保存的节点编号,动态生成该权限树。
    如何动态生成树,我想不用多说了,n多资料。
      

  15.   

    下面是微软给的例子,treeview的代码不是写在*.aspx中的吗?然后对他进行编译,用户在访问编译后的结构,对吗?
    <%@ Page %>
    <%@ Register TagPrefix="ie" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls" %><html>
      <body>
        <form runat="server">
          <ie:TreeView runat="server">
            <ie:TreeNode Text="My first Tree Node">
              <ie:TreeNode Text="My second Tree Node" />
            </ie:TreeNode>
          </ie:TreeView>
        </form>
      </body>
    </html>
      

  16.   

    错了,对于C/S模式来说,要连接数据库可能不是很方便,但是对于B/S模式,要连接数据库简直易如登天,既然这样,你在一个新用户建立的时候为其分配默认的权限(记录在数据表中),然后在生成用户树的时候,以XML格式从数据库中读出数据用户的权限记录,生成相应的treeview,有什么难的吗???不知道楼主有什么疑问,为什么一定要从固定的xml文件中去读记录呢?
      

  17.   

    http://www.google.com/search?sourceid=navclient&hl=zh-CN&ie=UTF-8&q=treeview+%E5%8A%A8%E6%80%81%E7%BB%91%E5%AE%9A上GOOGLE搜索一下更快,直接看代码比在这里谈论来得更实在!
      

  18.   

    ”以XML格式从数据库中读出数据用户的权限记录,生成相应的treeview“这个自然是不难,不过现在结果在内存中,那么,是否必须写到aspx文件中,以供编译?
    我想各位都回答了“动态生成”中”动态“的问题而对“生成”并未回答
      

  19.   

    倒。楼上的啊,我真的觉得你很可爱,真的,,,,不就是要生成嘛,我既然都从数据库已xml形式把内容都读出来了,要绑定到treeview难道还有什么疑问吗?好了,既然你要讲生成,继续去google搜。内容:”treeview 生成树“  ,看完再说
      

  20.   

    真是急啊,讨论问题都不虚心.
    http://dev.csdn.net/develop/article/23/23267.shtm
    .NET平台下Web树形结构程序设计     选择自 lihonggen0 的 Blog
      

  21.   

    myoldsaturn(saturn) 真可爱,既然内存中都有了,难道还不能动态绑吗,非要一个硬盘里的xml文件,有意思!
      

  22.   

    知道了,我把思路理一下,每次打开含有树的网页,page_load的时候先通过数据库生成一个如下结构的
    XML文件,然后把该XML动态绑定到treeview控件上,就可以了。
    <ie:TreeView runat="server">
            <ie:TreeNode Text="My first Tree Node">
              <ie:TreeNode Text="My second Tree Node" />
            </ie:TreeNode>
          </ie:TreeView>
    不过还有一个问题,如果同时几个用户需要将权限目录结构写入A.XML,这个时候就只有一个用户能使用这个文件去绑定TREEVIEW控件,于是其他用户就会看到出错信息(无权访问或访问被拒绝什么的)对吧???这个问题有好的解决方法吗?
      

  23.   

    楼上的,不需要xml一样能生成树,你不要老想着绑定,你可以用代码控制一个节点一个节点加啊!
      

  24.   

    为什么一定要用.xml 文件呢?是不是你不能操作数据库啊?其实读固定xml文件也没关系的,反正生成树的代码是一个循环读取节点的过程,既然你的.xml文件是固定的,那你总有地方记录用户权限的地方吧?如果没有就不说了,有的话,你在这个循环写节点的代码中去做判断,判断当这个节点=“***”的时候,用户是否有权限,如果没有,就不写这个节点,。,,,,明白?这样也可以做到,前提是你有地方记录用户权限
      

  25.   

    楼上的,你说的方法在ASPX中好像行不通啊
      

  26.   

    权限记录是在数据库中,我们就是将可以访问的表名组合成一个treeview和treenode写成的树写人xml,再绑定上树控件,难道你绑定绑定树不用xml文件吗?有其他的途径吗?
      

  27.   

    我对这个问题还想问问有没有其他解决方案:
    如果同时几个用户需要将目录结构写入A.XML,但这个时候只有一个用户能对该XML文件进行写,其他用户必须该用户对A.XML读写完了才能使用该文件进行写操作,于是其他用户就会看到出错信息(无权访问或访问被拒绝什么的)。如何避免这个问题???
      

  28.   


    回复人: kenMoxi(薪水一点,事儿一堆) (
    在数据库里新建一个表,然后将treeView的成员添加在这个表里面,更具不同的权限读取不同的记录
    然后,在生成树就可以了!同意kenMoxi(薪水一点,事儿一堆)
      

  29.   

    楼上的,用程序呀,用代码,不要用什么xml文件绑定了,在数据库里面通过权限读出他能加载的节点表,在通过代码做个循环加到树形控件不就得了,难道你就只会绑定,不会用代码?
      

  30.   

    楼上的,我觉得你这个方法对于ASPX是不行的,对于 其他的vb.net/vc.net等可以
      

  31.   

    我倒楼上的难道不知道aspx和aspx.vb 或者 aspx.cs文件都是用vb.net 或者c#写出来的吗?难道你认为aspx是一门开发语言吗?天啊无语
      

  32.   

    楼上的,我觉得你这个方法对于ASPX是不行的,对于 其他的vb.net/vc.net等可以
      

  33.   

    给你一段代码供参考:using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;
    using Microsoft.Web.UI.WebControls;namespace NCMT
    {
    /// <summary>
    /// NavigationIn 的摘要说明。
    /// </summary>
    public class NavigationIn : System.Web.UI.Page
    {
    protected Microsoft.Web.UI.WebControls.TreeView tvwNaviIn;

    protected SqlConnection conn;
    protected SqlDataAdapter apt;
    protected DataSet ds;
    protected string strSql; private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!Page.IsPostBack)
    {
    if(Session["UserID"] == null || Session["UserID"].ToString() == "" || Session["UserID"].ToString() == String.Empty)
    {
    Response.Write("<script language=javascript>window.top.location.href='../login.aspx'</script>");
    } string sConn = ConfigurationSettings.AppSettings["NCMT"];
    conn = new SqlConnection(sConn); CreateDataSet();
    InitNavigationTree(tvwNaviIn.Nodes,"0");
    }
    }
    //创建数据集
    private DataSet CreateDataSet()
    {
    strSql = "Select Distinct a.ID,a.F_NodeID,a.F_NodeName,a.F_ParentID,a.F_NavigateUrl,a.F_ImageUrl,a.F_OutOrIn From T_Function a,T_Role b,T_UserToRole c,T_RoleToFunc d Where c.F_UserID = '" + Session["UserID"].ToString() + "' And b.F_RoleID = c.F_RoleID And b.F_RoleID = d.F_RoleID And a.F_NodeID = d.F_FuncID Order By a.ID"; apt = new SqlDataAdapter(strSql,conn);
    ds = new DataSet();
    apt.Fill(ds,"dtNavigateIn");
    return ds;
    } //初始化导航树,通过递归调用显示子树
    private void InitNavigationTree(TreeNodeCollection tncCurrent,string sParentID)
    {
    DataView dvw = new DataView();
    TreeNode nodTemp;
    string strTempID;
    dvw.Table = ds.Tables["dtNavigateIn"];
    dvw.RowFilter = "F_ParentID = '" + sParentID + "'";
    foreach(DataRowView drv in dvw)
    {
    nodTemp = new TreeNode();
    nodTemp.ID = drv["F_NodeID"].ToString();
    nodTemp.Text = drv["F_NodeName"].ToString();
    nodTemp.NavigateUrl = drv["F_NavigateUrl"].ToString();
    nodTemp.ImageUrl = drv["F_ImageUrl"].ToString();
    nodTemp.Target = "MainIn"; tncCurrent.Add(nodTemp);
    strTempID = drv["F_ParentID"].ToString();
    //递归调用
    InitNavigationTree(nodTemp.Nodes,nodTemp.ID);
    }
    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }
      

  34.   

    我是说,实现问题的方式是有区别的。
    如果说编程实现的话,要在.aspx.vb下面编码???
      

  35.   

    唉  本来是讨论技术问题   现在转到比较B/S和C/S的优劣上去了
      

  36.   

    好像没有人在讨论B/S和C/S的优劣吧
      

  37.   

    呵呵,主要是有的同志对web的理解有问题,对asp.net不理解,所以会让一个20分的帖子出现跟贴49的可能
      

  38.   

    回复人: myoldsaturn(saturn) ( ) 信誉:100  2004-10-22 16:42:00  得分: 0  
     
       我是说,实现问题的方式是有区别的。
    如果说编程实现的话,要在.aspx.vb下面编码???
      
    这句话你是说对了,就是在.aspx.vb下面编码,我的权限设置就是这么实现的。
    跟你说说微软的treeview控件吧,它其实就是利用htc控制外观和动作,用XML实现内容更改的。
    如果你把服务器上C:\Inetpub\wwwroot\webctrl_client\1_0\treeview.htc文件删掉,就可以从浏览器里面看到一堆连续的文字,这些文字就是你的菜单内容。
    编程可以修改tv的node,也就是重建整个tv。============================================
    另外,你对B/S结构有个根本性的理解错误,你认为所有用户访问的都是那“一个”页面,所以他们看到的内容就应该是一样的。事实并非如此,在Web服务器上存在一个session的概念,多个用户访问同一个页面,但是他们的状态并不一定相同,由于存在状态的差别,就可以产生不同的观看效果。
    比如对于我们现在看到的这个页面,我回复就挂我的名字,你回复就挂你的名字,页面相同,结果不同。
      

  39.   

    楼上的说的好。
    觉得大家在这里讨论很好。。
    生成树的代码就要写在.vb或.cs中。用递递归产生树的节点及子节点。。
    B/S下每个人的访问如果涉及到权限当然不一样。
    不知道 myoldsaturn(saturn)有没有邮箱。不会每个人进入邮箱都是同一个吧。。