首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请问谁有treeview的无限级树的代码,或者实例,能发给我看看么? [已结贴,结贴人:li5206610]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-24 22:49:48 楼主
    我的QQ:33544597 我是新手不好意思,各位大哥帮帮忙
    120  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-25 11:23:161楼 得分:0
    我发给你 你先给我分

    94189919
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-25 15:12:172楼 得分:0
    递归
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-25 15:17:533楼 得分:0
    学编程 递归必须掌握啊。
    楼主多看看相关资料,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ph580
    • 等级:
    发表于:2008-01-25 15:20:524楼 得分:20

    //静态事件
    var Tree = {
      source: [],
      fillElement: '',
      buildTitle: [],
      openRan: 1,
      fileImg : true,
      imgPath: 'images',
     
      openIndexs: '',
      nodePlaces: [],
      Image: {
        'TI_OPEN':    'FOpen.gif',
        'TI_CLOSE':  'FClose.gif',
        'TI_I':      'I.gif',
        'TI_L':      'L.gif',
        'TI_T':      'T.gif',
        'TI_LMINUS':  'Lminus.gif',
        'TI_LPLUS':  'Lplus.gif',
        'TI_RMINUS':  'Rminus.gif',
        'TI_RPLUS':  'Rplus.gif',
        'TI_TMINUS':  'Tminus.gif',
        'TI_TPLUS':  'Tplus.gif',
        'TI_BLANK':  'Blank.gif',
        'NI_DEFAULT': 'Leaf.gif',
        'NI_LOCATION':'NodeChecked.gif'
      },
     
      TransNodeImg: function(imgObj) {
        var oldSrc,newSrc;

    oldSrc = imgObj.src.replace(/.*\/([a-zA-Z]+)\.gif/,"$1").toLowerCase();
    switch(oldSrc){
      case 'lminus':
    newSrc = this.Image['TI_LPLUS'];
    break;
      case 'lplus':
    newSrc = this.Image['TI_LMINUS'];
    break;
      case 'tminus':
    newSrc = this.Image['TI_TPLUS'];
    break;
      case 'tplus':
    newSrc = this.Image['TI_TMINUS'];
    break;
      case 'fclose':
    newSrc = this.Image['TI_OPEN'];
    break;
      case 'fopen':
    newSrc = this.Image['TI_CLOSE'];
    break;
    }
    if(newSrc) imgObj.src = imgObj.src.replace(/([a-zA-Z]+)\.gif/, newSrc);
      },
     
      nodeExpand: function(itemIndex) {
        $(itemIndex +'_box').toggle();
       
        var objImg = $(itemIndex +'_div').getElementsByTagName("img");
        this.TransNodeImg(objImg[objImg.length-1]);
        if (objImg[objImg.length-2]) this.TransNodeImg(objImg[objImg.length-2]);
      },
     
      ExpandParent:function(itemIndex) {
        var parent = '';
        var indexArray = itemIndex.split('_').slice(0, -1);
         
        indexArray.each(function(itemIndex) {
          var element = $(parent + itemIndex +'_box');
          if (!element) {
            Tree.InsertNode(parent + itemIndex);
            element = $(parent + itemIndex +'_box');
          }
          if (!element.visible()) Tree.nodeExpand(parent + itemIndex);
         
          parent += itemIndex +'_';
        });
      },
     
      ExpandAll: function(treeDiv, boolExpand) {
        var objDiv = $(treeDiv).getElementsByTagName("div");
       
        $A(objDiv).each(function(div, index) {
          if (/_box$/.test(div.id)) {
            var change = boolExpand != $(div).visible();

            if (change) {
              var objImg = objDiv[index -1].getElementsByTagName("img");
              this.TransNodeImg(objImg[objImg.length-1]);
              if (objImg[objImg.length-2]) this.TransNodeImg(objImg[objImg.length-2]);
              $(div).toggle();
            }
          }
        }.bind(this));
      },
     
      CheckCheckbox: function(itemIndex) {
        var boolen = $(itemIndex +'_checkbox').checked;
        var objTreeNode = $(itemIndex +'_box');
       
        if (objTreeNode) {
          var nodeCheckBox = objTreeNode.getElementsByTagName("input");
          $A(nodeCheckBox).each(function(checkbox) {
            checkbox.checked = boolen;
          });
        }
       
        if (boolen) {
          var parent = '';
          var indexArray = itemIndex.split('_').slice(0, -1);
         
          indexArray.each(function(itemIndex) {
            $(parent + itemIndex +'_checkbox').checked = true;
            parent += itemIndex +'_';
          });
        }
      }, 

      getTreeNode: function(itemIndex) {
        var str = '';
        var array = itemIndex.split('_');
           
        array.each(function(value) {
          str += '['+ (value - 1) +'].TreeNode';
        });
        return eval('this.source'+ str);
      },

      InsertNode: function(itemIndex) {
        if (!$(itemIndex + '_box')) {
          var html = ' <div id="'+ itemIndex +'_box" style="display:none">';
          html += this.Create(this.getTreeNode(itemIndex), itemIndex, this.nodePlaces[itemIndex]);
          html += ' </div>';
          new Insertion.After(itemIndex + '_div', html);
        }
       
        this.nodeExpand(itemIndex);
      },

      initialize: function() {
        $(this.fillElement).update(this.Create(this.source, 0, []));
      },

      Create: function(source, itemIndex, nodePlace) {
        var itemIndexs = this.getItemIndexs(itemIndex);
        var htmls = '';
       
        source.each(function(treeNode, index) {
          var itemIndex = this.getItemIndex(itemIndexs, index);
          var isClosed = treeNode.isOpened != undefined ? !treeNode.isOpened : (this.openRan <= nodePlace.length);
          if (isClosed) if (this.openIndexs.indexOf(','+ itemIndex) > -1) isClosed = false;
          var isTreeNode = treeNode.TreeNode ? true : false;
          var isLast = index == source.length - 1;
         
          var html = '';
          html += ' <div class="TreeNode" id="'+ itemIndex +'_div">';
          html += this.buildLine(nodePlace);
          html += this.naviImg(isClosed, isTreeNode, isLast, itemIndex);
          html += this.buildTitle(treeNode, itemIndex, isTreeNode);
          html += ' </div>';
          htmls += html;

          if (!isClosed) {
            if (isTreeNode) {
              var html_ = '';
              var displayed = isClosed ? 'style="display:none"' : '';
              html_ += ' <div id="'+ itemIndex +'_box" '+ displayed +'>';
              html_ += this.Create(treeNode.TreeNode, itemIndex, nodePlace.concat(isLast));
              html_ += ' </div>';
             
              htmls += html_;
            }
          } else {
            this.nodePlaces[itemIndex] = nodePlace.concat(isLast);
          }
        }.bind(this));
         
        return htmls;
      },

      getItemIndexs: function(itemIndex) {
        return (itemIndex == 0) ? '' : itemIndex;
      },
     
      getItemIndex: function(itemIndexs, index) {
        return (itemIndexs == '' ? '' : itemIndexs + '_') + (index+1);
      },

      buildLine: function(nodePlace) {
        return nodePlace.map(function(bool) {
          if (bool)
            return this.buildImg(this.Image.TI_BLANK);
          else
            return this.buildImg(this.Image.TI_I);
        }.bind(this)).join('');
      },

      naviImg: function(isClosed, isTreeNode, isLast, itemIndex) {
        var html = '';
       
        if (isTreeNode) {
          if (isClosed) {
            if (isLast)
              html += this.CreatNodeImg(this.Image.TI_LPLUS, itemIndex);
            else
              html += this.CreatNodeImg(this.Image.TI_TPLUS, itemIndex);

            if (this.fileImg)
              html += this.buildImg(this.Image.TI_CLOSE);
          } else {
            if (isLast)
              html += this.CreatNodeImg(this.Image.TI_LMINUS, itemIndex);
            else
              html += this.CreatNodeImg(this.Image.TI_TMINUS, itemIndex);

            if (this.fileImg)
              html += this.buildImg(this.Image.TI_OPEN);
          }
        } else {
          if (isLast)
            html += this.buildImg(this.Image.TI_L);
          else
            html += this.buildImg(this.Image.TI_T);
           
          if (this.fileImg)
            html += this.buildImg(this.Image.NI_DEFAULT);
        }

        return html;
      },
     
      CreatNodeImg: function(image, itemIndex) {
        var attribute = 'onclick="Tree.InsertNode(\''+ itemIndex +'\')" style="cursor:hand"';
        return ' <IMG src="'+ this.imgPath +'/'+ image +'"' + attribute +' align="absMiddle">';
      },
     
      buildImg: function(image, itemIndex) {
        return ' <IMG src="'+ this.imgPath +'/'+ image +'" align="absMiddle">';
      },
     
      buildTitle: function() {}
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-25 16:48:195楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • webhaitao
    • 等级:
    发表于:2008-01-25 21:11:146楼 得分:0
    可以用HTML填充,
    用控件太复杂了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-25 21:46:557楼 得分:0
    我倒是有直接使用的类,比上面的还简单好用,也是递归算法。花了不少香烟搞的,支持ODBC和Oledb直接绑定。
    想要吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-25 21:53:038楼 得分:0
    写个 递归方法得了,很简单啊 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-26 08:41:449楼 得分:0
    占位
    写过一个递归 等我找找
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-26 08:45:5010楼 得分:50
    TreeView控件的 这个是.net2005环境下的 2003也能用 menuInfo 和menuOp是我自定义的类 不用理它
    C# code
    /// <summary> /// 初始化左栏列表树 /// </summary> protected void InitMenuTree() { //选取模块列表 MenuInfo mi = new MenuInfo(); MenuOp mo = new MenuOp(); mi.ParentId = -1; DataTable dt = mo.SelectMenu(mi); if (dt == null || dt.Rows.Count == 0) return; tvMenu.ShowExpandCollapse = true; tvMenu.ShowLines = false; tvMenu.CollapseImageUrl = virRoot + "/Images/012.png"; tvMenu.ExpandImageUrl = virRoot + "/Images/013.png"; tvMenu.NoExpandImageUrl = virRoot + "/Images/014.png"; for (int i = 0; i < dt.Rows.Count; i++) { TreeNode tn = new TreeNode(); tn.Text = dt.Rows[i][MenuInfo.Fields.MenuName] == null ? "" : dt.Rows[i][MenuInfo.Fields.MenuName].ToString(); tn.Value = dt.Rows[i][MenuInfo.Fields.MenuId].ToString(); tn.NavigateUrl = virRoot + (dt.Rows[i][MenuInfo.Fields.FrmUrl] == null ? "" : dt.Rows[i][MenuInfo.Fields.FrmUrl].ToString()); //tn.ImageUrl = virRoot + "/images/bb.gif"; tn.Target = "frmMain"; tn.PopulateOnDemand = true; tn.Expand(); tvMenu.Nodes.Add(tn); InitChildNodes(tn, 1); } } /// <summary> /// 递归添加节点 /// </summary> /// <param name="t">节点实例</param> /// <param name="expandLevel">节点展开的级数</param> protected void InitChildNodes(TreeNode t,int expandLevel) { MenuInfo mi = new MenuInfo(); MenuOp mo = new MenuOp(); mi.ParentId = int.Parse(t.Value); DataTable dt = mo.SelectMenu(mi); if (dt == null || dt.Rows.Count == 0) return; for (int i = 0; i < dt.Rows.Count; i++) { TreeNode tn = new TreeNode(); tn.Text = dt.Rows[i][MenuInfo.Fields.MenuName] == null ? "" : dt.Rows[i][MenuInfo.Fields.MenuName].ToString(); tn.Value = dt.Rows[i][MenuInfo.Fields.MenuId].ToString(); tn.NavigateUrl = virRoot + (dt.Rows[i][MenuInfo.Fields.FrmUrl] == null ? "" : dt.Rows[i][MenuInfo.Fields.FrmUrl].ToString()); //tn.ImageUrl = virRoot + "/images/bb.gif"; tn.Target = "frmMain"; tn.PopulateOnDemand = true; if (--expandLevel > 0){tn.Expand();}else{tn.Collapse();} t.PopulateOnDemand = false; t.SelectAction = TreeNodeSelectAction.SelectExpand; t.ChildNodes.Add(tn); InitChildNodes(tn, expandLevel); } return; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-26 08:52:0911楼 得分:0
    上面的树 单击文本旁边的叉号和文本内容都能展开节点
    哦 还有表结构很重要 构成数据的从属关系  一并给了
    SQL code
    CREATE TABLE [dbo].[Menu] ( [MenuID] [int] IDENTITY (1, 1) NOT NULL , [parentId] [int] NULL , [MenuName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [FrmName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [FrmUrl] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NULL , [Ztsx] [char] (2) COLLATE Chinese_PRC_CI_AS NULL , [MenuOrder] [int] NULL , [Pic] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL , [del] [bit] NULL , [addTime] [datetime] NULL ) ON [PRIMARY]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ynw506
    • 等级:
    发表于:2008-01-26 09:57:4212楼 得分:0
    51aspx上有具体的代码,lz可以去逛逛~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wdzr_826
    • 等级:
    发表于:2008-01-26 12:03:2713楼 得分:0
    同意10楼
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-26 12:05:0314楼 得分:50
    SQL code
    ----数据库环境: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[template]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[template] GO CREATE TABLE [template] ( [科目编码] [varchar] (50) NULL , [名称] [varchar] (50) NULL , [上级科目编码] [varchar] (50) NULL ) INSERT [template] ( [科目编码] , [名称] , [上级科目编码] ) VALUES ( 'a1' , 'aa' , 'R' ) INSERT [template] ( [科目编码] , [名称] , [上级科目编码] ) VALUES ( 'a2' , 'bb' , 'R' ) INSERT [template] ( [科目编码] , [名称] , [上级科目编码] ) VALUES ( 'a3' , 'cc' , 'a1' ) INSERT [template] ( [科目编码] , [名称] , [上级科目编码] ) VALUES ( 'a4' , 'dd' , 'a1' ) INSERT [template] ( [科目编码] , [名称] , [上级科目编码] ) VALUES ( 'a5' , 'ee' , 'a3' ) INSERT [template] ( [科目编码] , [名称] , [上级科目编码] ) VALUES ( 'a6' , 'ff' , 'a5' )


    C# code
    ----后台示例: private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { bind(); } } public void bind() { string sql="select * from template a where not exists(select 1 from template where 科目编码=a.上级科目编码) "; DataSet ds=databind(sql); if(ds!=null && ds.Tables["tree"].Rows.Count>0) { foreach(DataRow dr in ds.Tables["tree"].Rows) { TreeNode tn=new TreeNode(); tn.Text=dr["名称"].ToString(); tn.Target=dr["科目编码"].ToString(); TreeView1.Nodes.Add(tn); addtree(tn.Target,tn); } } } //数据绑定 private DataSet databind(string sql) { SqlConnection conn=new SqlConnection("server=.;database=master;uid=sa;pwd=sa"); SqlDataAdapter da=new SqlDataAdapter(sql,conn); DataSet ds=new DataSet(); da.Fill(ds,"tree"); return ds; } //递归查找并加载子节点 public void addtree(string ParentID,TreeNode pNode) { string sql="select * from template where 上级科目编码='"+ ParentID +"'"; DataSet ds=databind(sql); if(ds==null || ds.Tables["tree"].Rows.Count<=0) return; else { foreach(DataRow dr in ds.Tables["tree"].Rows) { TreeNode tn=new TreeNode(); tn.Text=dr["名称"].ToString(); tn.Target=dr["科目编码"].ToString(); pNode.Nodes.Add(tn); addtree(tn.Target,tn); } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-17 15:32:4915楼 得分:0
    C# code
    ----后台示例: private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { bind(); } } public void bind() { string sql="select * from template a where not exists(select 1 from template where 科目编码=a.上级科目编码) "; DataSet ds=databind(sql); if(ds!=null && ds.Tables["tree"].Rows.Count>0) { foreach(DataRow dr in ds.Tables["tree"].Rows) { TreeNode tn=new TreeNode(); tn.Text=dr["名称"].ToString(); tn.Target=dr["科目编码"].ToString(); TreeView1.Nodes.Add(tn); addtree(tn.Target,tn); } } } //数据绑定 private DataSet databind(string sql) { SqlConnection conn=new SqlConnection("server=.;database=master;uid=sa;pwd=sa"); SqlDataAdapter da=new SqlDataAdapter(sql,conn); DataSet ds=new DataSet(); da.Fill(ds,"tree"); return ds; } //递归查找并加载子节点 public void addtree(string ParentID,TreeNode pNode) { string sql="select * from template where 上级科目编码='"+ ParentID +"'"; DataSet ds=databind(sql); if(ds==null || ds.Tables["tree"].Rows.Count<=0) return; else { foreach(DataRow dr in ds.Tables["tree"].Rows) { TreeNode tn=new TreeNode(); tn.Text=dr["名称"].ToString(); tn.Target=dr["科目编码"].ToString(); pNode.child.add(tn); addtree(tn.Target,tn); } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-10 10:48:4216楼 得分:0
    这么多方法那个好呢!我看10楼的还好点清析呀
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved