用递归实现树形结构

时间:2021-08-31 16:03:47
怎么实现省市的树形结构,  比如:  上海市下面有很多的区,一个区下面又有很多的镇,  用递归实现,各位大大,最好能详细点,    用几个表实现?

11 个解决方案

#1


一个表就可以了。可以分配编码 每两位一个级别
例如上海市 00
下面的 区1 0001
      区 2  0002 

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

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

#2


引用 1 楼 fb13579 的回复:
一个表就可以了。可以分配编码 每两位一个级别
例如上海市 00
下面的 区1 0001
      区 2  0002

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

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


不太明白,能说清楚点吗?

#3


三个表,操作、插入数据、维护起来方便。


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

#4


对,我是要实现三级树,请教了

#5


两个循环就好了吧

#6


一个表实现(区划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);
}



}

#7


jfzr

#8


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); 
          } 
        } 
    } 

#9


类似代码:


获取数据集 
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 


#10


^:^

#11


引用 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……


不太明白这个代码~可否给解说一下?

#1


一个表就可以了。可以分配编码 每两位一个级别
例如上海市 00
下面的 区1 0001
      区 2  0002 

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

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

#2


引用 1 楼 fb13579 的回复:
一个表就可以了。可以分配编码 每两位一个级别
例如上海市 00
下面的 区1 0001
      区 2  0002

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

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


不太明白,能说清楚点吗?

#3


三个表,操作、插入数据、维护起来方便。


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

#4


对,我是要实现三级树,请教了

#5


两个循环就好了吧

#6


一个表实现(区划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);
}



}

#7


jfzr

#8


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); 
          } 
        } 
    } 

#9


类似代码:


获取数据集 
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 


#10


^:^

#11


引用 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……


不太明白这个代码~可否给解说一下?