用递归实现树形结构

love_fs 2010-01-19 12:39:11
怎么实现省市的树形结构, 比如: 上海市下面有很多的区,一个区下面又有很多的镇, 用递归实现,各位大大,最好能详细点, 用几个表实现?
...全文
1230 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
happysnow21 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyq11 的回复:]
if(!IsPostBack)
{
BindJG();
}
private void BindJG()
{
DataSet ds = new DataSet();
//获取数据
DataTable dtb = ds.Tables[0];
TreeNode root = new TreeNode();
root.Value = "0";
root.Text = "";
roo……
[/Quote]

不太明白这个代码~可否给解说一下?
  • 打赏
  • 举报
回复
^:^
love_fs 2010-01-19
  • 打赏
  • 举报
回复
对,我是要实现三级树,请教了
ouc_ajax 2010-01-19
  • 打赏
  • 举报
回复
三个表,操作、插入数据、维护起来方便。


select * from 市表;select * from 区表,select * from 镇表
这样查询出来的一个DataSet里边就有3个表.然后你给DataSet加上关系。叫做DataRealation,相当于数据库的
外键连接。这样ds.Table["市表"].Rows[0].GetChilds(DataRealation),得到的就是全部的对应区表记录!

这样两层foreach循环就可以遍历楼主需要的三级树了。

类似代码:

http://topic.csdn.net/u/20100115/09/10829fe1-62b0-4796-8261-8161c3291487.html
love_fs 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fb13579 的回复:]
一个表就可以了。可以分配编码 每两位一个级别
例如上海市 00
下面的 区1 0001
      区 2  0002

加载树的时候 根节点为Len(编码长度)='2'

用程序递归加载 每次都是上级编码 +2 即 Len(编码长度)=父节点编码长度+2 and 编码 like "父节点编码%"
[/Quote]

不太明白,能说清楚点吗?
fb13579 2010-01-19
  • 打赏
  • 举报
回复
一个表就可以了。可以分配编码 每两位一个级别
例如上海市 00
下面的 区1 0001
区 2 0002

加载树的时候 根节点为Len(编码长度)='2'

用程序递归加载 每次都是上级编码 +2 即 Len(编码长度)=父节点编码长度+2 and 编码 like "父节点编码%"
ouc_ajax 2010-01-19
  • 打赏
  • 举报
回复
类似代码:


获取数据集
private DataSet GetTableInfo()
{
DataTable table1 = ProjectBLL.GetProjectInfo(); //查询所有工程信息
table1.TableName = "pro";
string str_sql = "select * from Table_GaugeDate";
string str_sql1 = "select * from Table_GuageDateTime";
查询所有测期信息
DataTable table2 = Unlity.OledbHelper.ExecuteDataTable(Unlity.OledbHelper.str_connectionString, CommandType.Text, str_sql, null);
table2.TableName = "gua";
查询所有的观测日期信息
DataTable table3 = Unlity.OledbHelper.ExecuteDataTable(Unlity.OledbHelper.str_connectionString, CommandType.Text, str_sql1, null);
table3.TableName = "gut";
DataSet ds = new DataSet();
ds.Tables.Add(table1.Copy());
ds.Tables.Add(table2.Copy());
ds.Tables.Add(table3.Copy());

//添加关系
//MessageBox.Show("" + ds.Tables.Count);
DataRelation dr = new DataRelation("ProjectGuaageDate", ds.Tables["pro"].Columns["Table_Project_Id"], ds.Tables["gua"].Columns["Table_Project_Id"], false);
ds.Relations.Add(dr);

//DataColumn[] dc = new DataColumn[2] { ds.Tables["gua"].Columns["Table_Project_Id"], ds.Tables["gua"].Columns["Table_GaugeDate_Id"] };
//DataColumn[] dc1 = new DataColumn[2] { ds.Tables["gut"].Columns["Table_Project_Id"], ds.Tables["gut"].Columns["Table_GaugeDate_Id"] };

DataRelation dr1 = new DataRelation("GuageDateGuageDateTime", ds.Tables["gua"].Columns["Table_GaugeDate_Id"], ds.Tables["gut"].Columns["Table_GaugeDate_Id"], false);
ds.Relations.Add(dr1);

return ds;
}

/// <summary>
/// 绑定数据
/// </summary>
public void TreeView()
{
tv1.Nodes.Clear();

DataSet ds = GetTableInfo();
TreeNode pro_node, gua_node, gut_node;
for (int i = 0; i < ds.Tables["pro"].Rows.Count; i++) //获取所有的工程行数
{
pro_node = new TreeNode();
pro_node.Text = ds.Tables["pro"].Rows[i].ItemArray["工程名"].ToString();
pro_node.Tag = ds.Tables["pro"].Rows[i].ItemArray["工程编号"].ToString();
tv1.Nodes.Add(pro_node);
//获取工程对应的测期信息
DataRow[] drGuage = ds.Tables["pro"].Rows[i].GetChildRows("ProjectGuaageDate");
for (int j = 0; j < drGuage.Length; j++)
{
gua_node = new TreeNode();
if (Convert.ToString(drGuage[j].ItemArray[0]) == "")
{
break;
}
gua_node.Text = drGuage[j].ItemArray["期数"].ToString();
gua_node.Tag = drGuage[j].ItemArray["编号"].ToString();
pro_node.Nodes.Add(gua_node);
//获取测期对应的观测日期信息
DataRow[] drGuagt = ds.Tables["gua"].Rows[j].GetChildRows("GuageDateGuageDateTime");
for (int s = 0; s < drGuagt.Length; s++)
{
gut_node = new TreeNode();
if (Convert.ToString(drGuagt[s].ItemArray[0]) == "")
{
break;
}
gut_node.Text = drGuagt[s].ItemArray["观测日期"].ToString()
gut_node.Tag = drGuagt[s].ItemArray["编号"].ToString();
gua_node.Nodes.Add(gut_node);
}
}
tv1.SelectedNode = tv1.Nodes[0]; //窗体加载时默认选择第一个节点
}
}

这段代码是我改进后的代码,写的不好还请见谅。
如果我有这样的数据
工程:
编号:30,31
名称:测试工程,测试工程2

测期:
编号:1,2,3
期数:第一期,第二期,第一期
所属工程:测试工程,测试工程,测试工程2

观测日期:
编号:a1,a2,a3
期数:1,2,3
日期:2010-1-15,2010-1-16,2010-1-17

想实现的效果:
测试工程
第一期
2010-1-15
第二期
2010-1-16
测试工程2
第一期
2010-1-17


wuyq11 2010-01-19
  • 打赏
  • 举报
回复
if(!IsPostBack)
{
BindJG();
}
private void BindJG()
{
DataSet ds = new DataSet();
//获取数据
DataTable dtb = ds.Tables[0];
TreeNode root = new TreeNode();
root.Value = "0";
root.Text = "";
root.ImageUrl = "../images/folder.gif";
root.Expanded = true;
this.TreeView1.Nodes.Add(root);
initTree(dtb, "", root);
this.TreeView1.ExpandAll();
}

protected void initTree(DataTable dt, string nFatherid, TreeNode fatherNode)
{
DataView dv = new DataView(dt);

if (nFatherid == "")
dv.RowFilter = "depth='1'";
else
dv.RowFilter = "ParentId='"+nFatherid+"'";
foreach (DataRowView Row in dv)
{
TreeNode node = new TreeNode();
if (fatherNode.Value == "0")
{
node.Value = Row["BH"].ToString();
node.Text = Row["mc"].ToString();
node.NavigateUrl = "";
node.ImageUrl = "../images/folder.gif";
fatherNode.ChildNodes.Add(node);
initTree(dt, Row["BH"].ToString(), node);
}
else
{
node.Text = Row["mc"].ToString();
node.Value = Row["BH"].ToString();
node.ImageUrl = "../images/jg.gif";
fatherNode.ChildNodes.Add(node);
}
}
}
KLL 2010-01-19
  • 打赏
  • 举报
回复
jfzr
kevinyueng 2010-01-19
  • 打赏
  • 举报
回复
一个表实现(区划ID,区划名称,上级区划ID),无限级树,默认第一级的上级区划ID为0或null

1.查找第一级区划
List<区划信息> 一级区划列表= 区划业务层.GetList("上级区划ID = 0");
foreach(var 区划信息 in 一级区划列表){
TreeNode node = new TreeNode(区划信息.区划名称,区划信息.区划ID)
迭代区划(node,区划信息.区划ID)
TreeView.Nodes.Add(node);
}


void 迭代区划(TreeNode parentNode,上级区划Id){
List<区划信息> 下级区划列表= 区划业务层.GetList(string.Format("上级区划ID = {0}",上级区划Id);
foreach(var 区划信息 in 下级区划列表){
TreeNode node = new TreeNode(区划信息.区划名称,区划信息.区划ID)
迭代区划(node,区划信息.区划ID)
parentNode.ChildNodes.Add(node);
}



}
flyerwing 2010-01-19
  • 打赏
  • 举报
回复
两个循环就好了吧

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧