高分相送!从数据库读取数据生成树的难题.
表内容如下:
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




