有一个DeptList的数据库中有一张Dept表,如下:
***************************************************************
lngDeptId (int型),lngFatherId (int型) ,strDeptName (cha'r(10))
1                ,       0            ,     北京部
2                ,       0            ,     上海部
3                ,       0            ,     广州部
4                ,       1            ,     海淀分部
5                ,       1            ,     朝阳分部
6                ,       1            ,     西城分部
7                ,       2            ,     靖安分部
8                ,       2            ,     黄埔分部
9                ,       4            ,     知青路部门
10               ,       4            ,     北外分部门
11               ,       8            ,     黄埔分部1
12               ,       8            ,     黄埔分部2
********************************************************在以上的数据中,lngFatherId项的值确定当前部门的上级部门,例如:"知青路部门"的lngFatherId为4,其上级部门就是lngDeptId为4的"海淀分部".用TreeView列表显示数据库的结构.显示后的结构大概为北京部
      海淀分部
             知青路部门
             北外分部门
      朝阳分部
      西城分部
上海部
      靖安分部
      黄埔分部
              黄埔分部1
              黄埔分部2
广州部
请教各位高手怎样用代码动态的加载子项???
             

解决方案 »

  1.   

    思路是在数据库中建立一张表,然后将上面的部门名称和层次存入表中
    之后用递归来实现,代码网上有,用google吧
      

  2.   

    DataTable dt = fun.GetDataTL().Tables[0];//GetDataTL查询,北京部,上海部,广州部的方法 for(int i=0;i< dt.Rows.Count;i++)
    {
    this.treeView1.Nodes.Add(dt.Rows[i]["strDeptName"].ToString()); DataTable dt1=fun.GetDataL().Tables[0];//GetDataL查询 子节点 的信息方法
    for(int a=0;a<dt1.Rows.Count;a++)
    {
    this.treeView1.Nodes[i].Nodes.Add(dt1.Rows[a]["strDeptName"].ToString());
    }
    }
    }
      

  3.   

    DataTable dt = ....//这里获取整个DeptList表的数据
    TreeView tree;//这是Form中TreeView控件变量
    //这是主调用方法
    private void LoadTree()
    {
        DataView dv = new DataView(dt);
       dv.RowFilter = "lngFatherId =0";//过滤出北京部、上海部等数据
       FillTree(dvT,null);//这里假设TreeView无根结点,只有北京部、上海部等兄弟结点,如果有要结点,则用根结点的TreeNode代替null传入
    }
    //用于递归调用的方法
    private void FillTree(DataView dvT,TreeNode node)
    {
        foreach(DataRowView drv in dvT)
        {
           TreeNode n = new TreeNode(drv.Row["strDeptName"].ToString());
           if(node == null)
              tree.Nodes.Add(n);
           else
              node.Nodes.Add(n);
           DataView dvChild = new DataView(dt);
           //获取当前部门的下级部门
           dvChild.RowFilter = RowFilter = "lngFatherId =" + drv.Row["lngDeptId"].ToString();
           FillTree(dvChild,n);//递归....       
        }
    }这些代码我是随手写的,可能有语法错误。但思路我想是没有错的,楼主试试...
      

  4.   

    private void Form1_Load(object sender, System.EventArgs e)
    {
    // treeView1.Nodes.AddRange(new TreeNode[] {new TreeNode("table1")});
    exec myexec=new exec();
    DataSet myDs=myexec.GetDs ("select name from Dept where perent=lngFatherId","name");
    DataTable myDt=myDs.Tables [0];
    // TreeNode node = treeView1.SelectedNode;
    foreach(DataRow myDr in myDt.Rows)
    {

    TreeNode myptn=new TreeNode (myDr["name"].ToString());
    treeView1.Nodes.Add(myptn);
    myptn.ImageIndex=0;
    myptn.SelectedImageIndex=2;
    TreeNode myson=new TreeNode ("a");
    myptn.Nodes.Add(myson);
    }
    } private void treeView1_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
    exec myexec=new exec();
    string index1= e.Node.Text;
                            DataSet myDs1=myexec.GetDs("select strDeptName form Dept where strDeptName='"+index1)+ "'","ingdeptid");
                            int index2=myDs1.tables[0].rows[0][0].text;
    DataSet myDs=myexec.GetDs ("select strDeptName  from Dept where lngFatherId ='"+index2+ "'","name");
    DataTable myDt=myDs.Tables [0];
    TreeNode node = e.Node ;
    node.Nodes.Clear ();
    foreach(DataRow myDr in myDt.Rows)
    {

    TreeNode myptn=new TreeNode (myDr["name"].ToString());
    node.Nodes.Add(myptn);
    myptn.ImageIndex=1;
    myptn.SelectedImageIndex=1;


    }

    }
    //////////////////// 
    public class exec
    {
    public exec()
    {
    }
    public DataSet GetDs(string selectStr,string tablename)
    {
    // string StrConn="Auto Translate=True;Integrated Security=SSPI;User ID=sa;Data Source=SHOUJIANHONG;Tag with column collation when possible=False;Initial Catalog=Material;Use Procedure for Prepare=1;Provider=SQLOLEDB.1;Persist Security Info=False;Workstation ID=SHOUJIANHONG;Use Encryption for Data=False;Packet Size=4096";
    // OleDbConnection myConn=new OleDbConnection (StrConn);
    // myConn.Open ();

    OleDbConnection myConn;
    data myData=new data ();
    myConn=myData.openDb ();
    OleDbDataAdapter myAdapter=new OleDbDataAdapter (selectStr,myConn);
    DataSet myDs=new DataSet ();
    myAdapter.Fill (myDs,tablename);
    myAdapter.Dispose() ;
    myConn.Close();
    return myDs;
    }
    }///////////////////
    public class data
    {
    OleDbConnection myConn;
    public data()
    {
    }
    public OleDbConnection openDb()
    {
    string connStr="Integrated Security=SSPI;Packet Size=4096;Data Source=C27;Tag with column collation when possible=False;Initial Catalog=Material;Use Procedure for Prepare=1;Auto Translate=True;Persist Security Info=False;Provider=SQLOLEDB.1;Workstation ID=C27;Use Encryption for Data=False";
    myConn=new OleDbConnection (connStr);
    myConn.Open ();
    return myConn;
    }
    public void closeDb()
    {
    myConn.Close ();
    }
    }
      

  5.   

    /// <summary>
    /// Rebuild Tree
    /// </summary>
    /// <param name="selectedIndex"></param>
    private void rebuildTree( string selectedIndex )
    {
    // Initial Tree
    TreeOperationDB treeOperation = new TreeOperationDB();
    treeOperation.SetTreeView(tvDocDir); TreeOperationDB.ExpandTreeNode(selectedIndex,this.tvDocDir.Nodes[0]);
    tvDocDir.SelectedNodeIndex = selectedIndex; // Set Initial
    this.SetPageView(MainPageStatus.ViewStatusInit);
    }/// <summary>
    /// Expand Tree Node according to the selectindex
    /// </summary>
    /// <param name="NodePath"></param>
    /// <param name="node"></param>
    public static void  ExpandTreeNode(string NodePath,TreeNode node)
    {
    string [] NodeIndex = NodePath.Split('.'); for(int i = 1;i < NodeIndex.Length ; i ++)
    {
    int Index = int.Parse( NodeIndex[i] ); node = node.Nodes[Index];

    if( i == NodeIndex.Length -1 )
    {
    node.Expanded = false ;
    }
    else
    {
    node.Expanded = true ;
    }
    }
    }/// <summary>
    /// Building Tree
    /// </summary>
    /// <param name="nodeCollection"></param>
    public void SetTreeView( TreeView docTree )
    {
    // Remove Existed Node
    for(int i = 0 ; i < docTree.Nodes.Count;i++)
    {
    docTree.Nodes[i].Remove();
    }
    // Get Node Info
    DataTable treeInfo = this.GetTreeData(); // Root Node
    TreeNode root = this.GetRootNode();
    docTree.Nodes.Add(root); // Building Tree
    this.AddNode( treeInfo , docTree.Nodes[0].Nodes , "0" );
    }
    /// <summary>
    /// Get All Node Info
    /// </summary>
    /// <returns></returns>
    public DataTable GetTreeData()
    {
    DataBase db = new DataBase(); try
    {
    db.Open();
    string checkSql = "SELECT * FROM T_DMS_TREE ORDER BY NodeText"; DataSet dsRst = new DataSet();
    db.ExecSQL(checkSql,"T_DOCTREE",out dsRst);

    return dsRst.Tables[0];
    }
    catch( Exception err )
    {
    throw err;
    }
    finally
    {
    db.Close();
    }
    }
    /// <summary>
    /// Get Root Of tree
    /// </summary>
    /// <returns></returns>
    private TreeNode GetRootNode()
    {
    DataBase db = new DataBase(); try
    {
    db.Open();
    string selectSql = "SELECT * FROM T_DMS_TREE WHERE NodeId = 0 "; DataSet dsRst = new DataSet();
    db.ExecSQL(selectSql,"T_DOCTREE",out dsRst);

    if( dsRst.Tables[0].Rows.Count == 0 )
    {
    throw new ApplicationException("No root node found!");
    } DataRow dr = dsRst.Tables[0].Rows[0];
    TreeNode node = new TreeNode(); node.ID = dr["NodeID"].ToString();
    node.Text = dr["NodeText"].ToString();
    node.NodeData = dr["UpdDate"].ToString() + "|" + dr["UpdUid"].ToString() ; return node;
    }
    catch( Exception err )
    {
    throw err;
    }
    finally
    {
    db.Close();
    }
    }
      

  6.   

    #region 递归产生系统表树形菜单节点
    private void treeMenu_Reload(DataTable allNodeTable,string parentColValue,TreeView myTreeView,TreeNode ParentNode)
    {
    DataRow[] myDataRows = allNodeTable.Select("上级节点 = "+parentColValue);

    foreach(DataRow myDataRow in myDataRows)
    {
    TreeNode myTableNode=new TreeNode();
    myTableNode.Tag=myDataRow["节点编号"];
    myTableNode.Text=myDataRow["节点名称"].ToString(); if(ParentNode != null)
    ParentNode.Nodes.Add(myTableNode);
    else
    myTreeView.Nodes.Add(myTableNode); this.treeMenu_Reload(allNodeTable,myDataRow["节点编号"].ToString(),myTreeView,myTableNode);
    }
    }
    #endregion//调用
    sql = "SELECT QX_YH_BM as 节点编号,QX_YH_QM as 节点名称,'0' as 上级节点 FROM XT_QX_YH_TB ORDER BY QX_YH_QM ASC";//注意中文名称别名,我给固定住了
    DataTable allNodeTable = myWs.GetDs(sql,"allNodeTable").Tables[0];//得到DataTable this.treeMenu_Reload(allNodeTable,"0",treeMenu,null);
      

  7.   

    #region 递归产生系统表树形菜单节点
    private void treeMenu_Reload(DataTable allNodeTable,string parentColValue,TreeView myTreeView,TreeNode ParentNode)
    {
    DataRow[] myDataRows = allNodeTable.Select("上级节点 = "+parentColValue);

    foreach(DataRow myDataRow in myDataRows)
    {
    TreeNode myTableNode=new TreeNode();
    myTableNode.Tag=myDataRow["节点编号"];
    myTableNode.Text=myDataRow["节点名称"].ToString(); if(ParentNode != null)
    ParentNode.Nodes.Add(myTableNode);
    else
    myTreeView.Nodes.Add(myTableNode); this.treeMenu_Reload(allNodeTable,myDataRow["节点编号"].ToString(),myTreeView,myTableNode);
    }
    }
    #endregion//调用
    sql = "SELECT QX_YH_BM as 节点编号,QX_YH_QM as 节点名称,'0' as 上级节点 FROM XT_QX_YH_TB ORDER BY QX_YH_QM ASC";//注意中文名称别名,我给固定住了
    DataTable allNodeTable = myWs.GetDs(sql,"allNodeTable").Tables[0];//得到DataTablethis.treeMenu_Reload(allNodeTable,"0",treeMenu,null);//treeMenu就是treeview的名字