表内容如下:
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        朝阳区
......最后生成的的树形如下:
世界
   中国
   美国
       上海
          徐汇区
          闵行区
       北京
          朝阳区
       武汉
       
。能够一次性从数据库里读出数据生成。
因为我是在初始化的时候需要一次性的全部显示。

解决方案 »

  1.   

    将所有数据取出来,存在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);//递归调用增加子节点的方法,以实现对所有子节点的增加处理
        }
    }基本思路如此,你可以参考这个思路写就可以了.
    基本实现是很简单的。
      

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

    试了,跑到第六项的时候报错.
    报错位置:
       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);//递归调用增加子节点的方法,以实现对所有子节点的增加处理
                }
            }
      

  7.   

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

  8.   

    报什么错呢?看一下错误信息。另外,建议你把所有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);}
    }
      

  9.   

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

  10.   

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