CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

高分相送!从数据库读取数据生成树的难题.

楼主lqwxfdwj(风吹小楼)2006-02-19 11:13:08 在 .NET技术 / C# 提问

表内容如下:  
  id       child_id,parent_id,   name  
  1         0                 null               世界  
  2         01                 0                     中国  
  3         02                 0                     美国  
  4         011               01                   上海  
  5         012               01                   北京  
  6         013               01                   武汉  
  7         0111             011                 徐汇区  
  8         0112             011                 闵行区  
  9         0121             012                 朝阳区  
  ......  
   
  最后生成的的树形如下:  
  世界  
        中国  
        美国  
                上海  
                      徐汇区  
                      闵行区  
                北京  
                      朝阳区  
                武汉  
                 
  。  
   
  能够一次性从数据库里读出数据生成。  
  因为我是在初始化的时候需要一次性的全部显示。 问题点数:100、回复次数:16Top

1 楼lqwxfdwj(风吹小楼)回复于 2006-02-19 11:24:03 得分 0

没有人知道吗?Top

2 楼lqwxfdwj(风吹小楼)回复于 2006-02-19 11:25:24 得分 0

自已顶!Top

3 楼lovvver(ElephantTalk.Bright)回复于 2006-02-19 12:07:19 得分 90

将所有数据取出来,存在DataSet中,然后从根节点开始取起,循环画就是了。  
  如:  
  TreeNode   tnRoot;  
  tnRoot.Tag   =   0;//根节点编号  
  tnRoot.Text   =   "世界";  
  this.TreeView1.Nodes.Add(tnRoot);  
  AddChilds(tnRoot);//调用增加子节点方法  
   
  private   void   AddChilds(TreeNode   tn)  
  {  
          DataRow[]   drs   =   dsTree.Tables[0].Select("id="+tn.Tag.ToString());  
          foreach(DataRow   dr   in   drs)  
          {  
                  TreeNode   tnChild;  
                  tnChild.Tag   =   dr["id"].ToString();  
                  tnChild.Text   =   dr["text"].ToString();  
                  tn.Nodes.Add(tnChild);  
                  AddChilds(tnChild);//递归调用增加子节点的方法,以实现对所有子节点的增加处理  
          }  
  }  
   
  基本思路如此,你可以参考这个思路写就可以了.  
  基本实现是很简单的。Top

4 楼LifeAndC(蓝色忧郁)回复于 2006-02-19 13:05:02 得分 5

递归就可以,  
  先选择,用DataView过滤出当前节点的子向节点就可以,  
  如果用是int类型更方便.Top

5 楼lqwxfdwj(风吹小楼)回复于 2006-02-19 13:46:14 得分 0

我先试试Top

6 楼lizi02(冬虫夏草)回复于 2006-02-20 02:13:02 得分 5

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   Microsoft.Web.UI.WebControls;  
  using   egov2;  
  using   egov2.Components;  
   
  namespace   egov2.Query  
  {  
  ///   <summary>  
  ///   testTree   的摘要说明。  
  ///   </summary>  
  public   class   testTree   :BasePage  
  {  
  protected   Microsoft.Web.UI.WebControls.TreeView   treeView;          
  private   string   ccm="";  
  protected   System.Web.UI.WebControls.TextBox   tBox;  
  private   string   selectcom="";  
   
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
   
  if(!IsPostBack)  
  {  
  TreeNodeCollection   TNC=new   TreeNodeCollection();  
  treeView.ExpandLevel=1;  
  creatTree(ccm,treeView.Nodes);  
  }  
   
  }  
   
  public   void   creatTree(string   varccm,TreeNodeCollection   treeView)  
  {  
  try  
  {  
  selectcom="select   *   from   t_Industry   where   Industry_CCM   like   '"+varccm+"__'   ";  
   
  DataBase   db=new   DataBase(0);  
  db.Open();  
  DataSet   ds=db.runSQLDataSet(selectcom);  
  db.Close();  
   
  for(int   i=0;i<=ds.Tables[0].Rows.Count;i++)  
  {  
  TreeNode   node   =   new   TreeNode();  
  node.ID=ds.Tables[0].Rows[i]["Industry_ID"].ToString().Trim();  
  node.Text=ds.Tables[0].Rows[i]["Industry_Name"].ToString().Trim();  
  node.ImageUrl="/webctrl_client/1_0/images/folder.gif";  
  node.ExpandedImageUrl="/webctrl_client/1_0/images/folderopen.gif";  
  //node.NavigateUrl="/webctrl_client/1_0/images/folder.gif";  
  node.Expandable=ExpandableValue.Always;  
  treeView.Add(node);  
   
   
   
  creatTree(ds.Tables[0].Rows[i][2].ToString().Trim(),node.Nodes);  
  }  
  }  
  catch(Exception   e)  
  {  
  Response.Write("");  
  }  
   
  }  
   
  #region   Web   窗体设计器生成的代码  
  override   protected   void   OnInit(EventArgs   e)  
  {  
  //  
  //   CODEGEN:   该调用是   ASP.NET   Web   窗体设计器所必需的。  
  //  
  InitializeComponent();  
  base.OnInit(e);  
  }  
   
  ///   <summary>  
  ///   设计器支持所需的方法   -   不要使用代码编辑器修改  
  ///   此方法的内容。  
  ///   </summary>  
  private   void   InitializeComponent()  
  {          
  this.treeView.SelectedIndexChange   +=   new   Microsoft.Web.UI.WebControls.SelectEventHandler(this.treeView_SelectedIndexChange);  
  this.Load   +=   new   System.EventHandler(this.Page_Load);  
   
  }  
  #endregion  
   
  private   void   treeView_SelectedIndexChange(object   sender,   Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs   e)  
  {  
   
  string[]   index;  
  TreeNodeCollection   tmp=treeView.Nodes;  
   
  index=treeView.SelectedNodeIndex.Split(char.Parse("."));  
  for   (int   i=0;i<index.Length;i++)  
  {  
  if   ((i+1)==index.Length)  
  {  
  //Response.Write(tmp[int.Parse(index[i])].ID+"<br>");  
  tBox.Text=tmp[int.Parse(index[i])].Text;  
  }  
  tmp=tmp[int.Parse(index[i])].Nodes;  
  }  
   
                           
  //tBox.Text=e.NewNode.ToString();  
   
   
  }  
   
   
  }  
  }Top

7 楼lizi02(冬虫夏草)回复于 2006-02-20 02:14:38 得分 0

里面用TreeViewControl.msi的时候要很注意你的这个控件的那些图片文件夹放在你的项目里面Top

8 楼pengyu_365(哈哈)回复于 2006-02-20 09:22:38 得分 0

写得真复杂,有必要吗Top

9 楼lovvver(ElephantTalk.Bright)回复于 2006-02-20 09:31:38 得分 0

根本没有那么复杂!  
  其实用TreeView控件,取出数据,一个一个的递归往上画,就行了。Top

10 楼lqwxfdwj(风吹小楼)回复于 2006-02-20 11:03:03 得分 0

试了,跑到第六项的时候报错.  
  报错位置:  
        DataRow[]   drs   =   dsTree.Tables[0].Select("id="+tn.Tag.ToString());  
   
  我贴出源码:  
    private   void   button1_Click(object   sender,   EventArgs   e)  
                  {  
                          TreeNode   tnRoot   =   new   TreeNode();  
                          tnRoot.Tag   =   0;//根节点编号。  
                          tnRoot.Text   =   "世界";  
                          this.tvSysModule.Nodes.Add(tnRoot);  
                          AddChilds(tnRoot);//调用增加子节点方法  
                           
                  }  
   
                  private   void   AddChilds(TreeNode   tn)  
                  {  
   
                          pubclass   pc   =   new   pubclass();  
                          pc.Open();  
   
                          string   sql   =   "select   id,childid,parentid,name   from   modules";  
                          SqlDataAdapter   da   =   new   SqlDataAdapter(sql,   pc.conn);  
                          DataSet   dsTree   =   new   DataSet();  
                          da.Fill(dsTree,   "dsTree");  
                          DataRow[]   drs   =   dsTree.Tables[0].Select("parentid="   +   tn.Tag.ToString().Trim());  
                          foreach   (DataRow   dr   in   drs)  
                          {  
                                  TreeNode   tnChild   =   new   TreeNode();  
                                  tnChild.Tag   =   dr["childid"].ToString().Trim();  
                                  tnChild.Text   =   dr["name"].ToString().Trim();  
                                  tn.Nodes.Add(tnChild);  
                                  AddChilds(tnChild);//递归调用增加子节点的方法,以实现对所有子节点的增加处理  
                          }  
                  }Top

11 楼lqwxfdwj(风吹小楼)回复于 2006-02-20 11:08:36 得分 0

提示错误为"无法在System.string"和"System.int32"上执行"="操作。是怎么会事啊?我的child和parentid均为vchar类型。数据库为sql   server   2000Top

12 楼zhengjiang(笑看风云)回复于 2006-02-20 11:13:15 得分 0

学习啊。。Top

13 楼lovvver(ElephantTalk.Bright)回复于 2006-02-20 11:14:17 得分 0

报什么错呢?看一下错误信息。  
   
  另外,建议你把所有Module数据一次取出来,然后画,你这样画太慢了。  
   
  重新给你一个简单的例子,看一下,这是测试通过的。  
  private   void   InitGoodsTypeTree()  
  {  
  //清空树  
  this.tvwGoodsType.Nodes.Clear   ();  
   
  GoodsTypeNode   gn   =   new   GoodsTypeNode   ();  
  gn.Tag   =   -1;  
  gn.Text   =   "货物分类树";  
  gn.Grade   =   0;  
   
  this.tvwGoodsType.Nodes.Add   (gn);  
  AddChildNode(gn);  
  this.tvwGoodsType.ExpandAll   ();  
   
  }  
   
  private   void   AddChildNode(GoodsTypeNode   gn)  
  {  
  string   strFilter   =   "PARENT_CODE="+gn.Tag   .ToString   ();  
  //string   strOrderBy   =   "OrderBy   asc   ";  
  DataRow[]   drs   =   null;  
  try  
  {  
  drs   =   this.dtGoodsType.Select   (strFilter);  
  }  
  catch(Exception   ex)  
  {  
  throw   ex;  
  }  
   
  foreach(DataRow   dr   in   drs)  
  {  
  GoodsTypeNode   goodstypeNode   =   new   GoodsTypeNode   ();  
  goodstypeNode.Tag   =   Convert.ToInt32   (dr["GOODSTYPE_CODE"]);  
  goodstypeNode.Text   =   dr["GOODSTYPE_NAME"].ToString   ();  
  goodstypeNode.Grade   =   Convert.ToInt32   (dr["Grade"]);  
   
  AddChildNode(goodstypeNode);  
  gn.Nodes.Add   (goodstypeNode);  
   
  }  
  }Top

14 楼hy98521(斯达克)回复于 2006-02-20 11:31:19 得分 0

关注Top

15 楼lqwxfdwj(风吹小楼)回复于 2006-02-20 11:47:42 得分 0

通过了.错误原因为数据库的第一行记录为:parentid=null.从而导致了不能正确赋值.  
  非常感谢!Top

16 楼lizi02(冬虫夏草)回复于 2006-02-20 13:24:17 得分 0

drs   =   this.dtGoodsType.Select   (strFilter);  
  这个filter是怎么用的呢?Top

相关问题

  • treeview 读取数据库生成树 的问题 100分
  • 从数据库读取内容,生成CCS文件,如何实现?
  • asp如何读取数据库然后生成PDF报表供用户打印
  • 100分--asp.net menu如何从数据库中读取数据来生成menu,急!!!
  • 数据库读取
  • 请问有人有“读取数据库的内容,再生成数组”的script代码吗?
  • 高分征ASP读取数据库数据生成报表,PDF格式文件。200分
  • 那位可以提供一个简单的读取数据库数据并生成 js文件的例子
  • 如何将数据库一个字段里的a1,a2,a3,a4读取后生成多选菜单和单选菜单呢?
  • 需要读取数据库里面的值生成TreeView,树是IE Web Control里面的TreeView

关键词

  • 节点
  • 数据
  • tag
  • tnroot
  • tnchild
  • treeview
  • egov2
  • selectcom
  • 递归
  • addchilds

得分解答快速导航

  • 帖主:lqwxfdwj
  • lovvver
  • LifeAndC
  • lizi02

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo