如果是确定多少级,我可以查出顶级单位,先创建顶级单位的节点,再根据顶级单位的OrgID去列出下一级单位的节点。我试着用递推方法,没能成功,也没查出错误地方,请高手们不吝赐教,在下谢谢各位了!!!

解决方案 »

  1.   

    1.
       for () /取顶级单位
    {
         node.text=单位名称
         nextclass(单位ID) //递归函数 得到的单位ID 传入递归函数
    }
     nextclass(string id)
    {
       for ()
       {
          取本级单位信息 通过 上级 id 
          node.text=单位名称
          nextclass(单位ID) //递归函数 得到的单位ID 传入递归函数
       }
    }
     参考!!!!!!
      

  2.   

    for () 前 查出 本级单位信息(通过ID)
      

  3.   

    我补充一点:
    假设现在提供的OrgID是对应于【XX大学理学院】,
    则列出的树如下:
    省教育厅
    ------XX大学
          ------XX大学理学院
    如果提供的OrgID是对应于【XX大学】,
    则列出的树如下:
    省教育厅
    ------XX大学
    如果提供的OrgID是对应于【YY大学】,
    则列出的树如下:
    省教育厅
    ------YY大学
          
    也就是说只列出此OrgID相关的单位。
    不知道如何设计这个取顶级单位的方法,
    还有能否稍微详细说一下这个【递归函数】如何设计?
      

  4.   

    非常感谢【 yaoyaonet(绿洲)】的回复!!!
    兄弟能否再详细一些,在下真的非常感谢!!!
      

  5.   

    using System;
    using System.Windows.Forms;
    using System.Data;namespace Ldl.WinTreeView
    {
    /// <summary>
    /// LdlBulidTreeView 的摘要说明。
    /// </summary>
    public class LdlWinBulidTreeView
    {
    private TreeView treeView;
    private DataTable tb;
    private string strSort;
    private int intKey;
    private int intText; public LdlWinBulidTreeView(TreeView treeView,DataTable tb,string strSort,int intKey,int intText)
    {
    this.treeView=treeView;
    this.tb=tb;
    this.strSort=strSort;
    this.intKey=intKey;
    this.intText=intText;
    } public void BulidTopTree()
    {
    Cursor.Current = new Cursor("L_WAIT01.cur");
    treeView.BeginUpdate(); TreeNodeCollection tnParentNodes = treeView.Nodes;
    TreeNode tnChildNode;
    string strRowFilter; tnParentNodes.Clear();
    DataView dvTop=new DataView();
    dvTop.Table=tb;
    dvTop.RowFilter="nItemPK=nParentItemPK";
    dvTop.Sort=strSort;
    for (int i=0;i<dvTop.Count;i++)
    {
    tnChildNode=new TreeNode();
    tnChildNode.Tag=dvTop[i][intKey].ToString();
    tnChildNode.Text=dvTop[i][intText].ToString(); 
    tnParentNodes.Add(tnChildNode);
    strRowFilter="nItemPK <>nParentItemPK and nParentItemPK="+dvTop[i][intKey].ToString();
    BulidSubTree(tnChildNode,strRowFilter);
    } Cursor.Current = Cursors.Default;
    treeView.EndUpdate();
    treeView.TopNode.Expand(); }
    private void BulidSubTree(TreeNode tnParentNode,string strRowFilter)
    { TreeNode tnChildNode;
    string strSubRowFilter;
    DataView dvSub=new DataView();
    dvSub.Table=tb;
    dvSub.RowFilter=strRowFilter;
    dvSub.Sort=strSort;
    for (int i=0;i<dvSub.Count;i++)
    {
    tnChildNode=new TreeNode();
    tnChildNode.Tag=dvSub[i][intKey].ToString();
    tnChildNode.Text=dvSub[i][intText].ToString(); 
    tnParentNode.Nodes.Add(tnChildNode);
    strSubRowFilter="nItemPK <>nParentItemPK and nParentItemPK="+tnChildNode.Tag.ToString();
    BulidSubTree(tnChildNode,strSubRowFilter);
    }
    }  }
    }
      

  6.   

    相似的代码:一样的功能。
    private void CreateTree()
    {  
    string sqltxt="Persist Security Info=False;User ID=sa;Initial Catalog=zhongtian;Data Source=ytf;Password=xu;";
    SqlConnection sqlcon=new SqlConnection(sqltxt);
      
    SqlCommand sqlcom=new SqlCommand("Select * from product_class where fatherid='0'",sqlcon);
    try
    {
    sqlcon.Open();
    SqlDataReader sqlreader=sqlcom.ExecuteReader();
    while(sqlreader.Read())
    {
    TreeNode mynode=new TreeNode();
    mynode.Text=sqlreader.GetString(2);
    mynode.Tag=sqlreader.GetValue(1).ToString()+'|'+sqlreader.GetValue(2).ToString()+'|'+sqlreader.GetValue(3).ToString()+'|'+sqlreader.GetValue(0).ToString();
    treeView1.Nodes.Add(mynode);

    NextTree(sqlreader.GetValue(0).ToString(),treeView1.Nodes[0]);
    }
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    finally
    {
    sqlcon.Close();
    }
    } private void NextTree(string nodeid,TreeNode parentnode)
    {
    string sqltxt="Persist Security Info=False;User ID=sa;Initial Catalog=zhongtian;Data Source=ytf;Password=xu;";
    SqlConnection sqlcon=new SqlConnection(sqltxt);
      
    SqlCommand sqlcom=new SqlCommand("Select * from product_class where fatherid='"+ nodeid +"'",sqlcon);
    try
    {
    sqlcon.Open();
    SqlDataReader sqlreader=sqlcom.ExecuteReader();

    while(sqlreader.Read())
    {
    TreeNode mynode=new TreeNode(sqlreader.GetString(2));
    parentnode.Nodes.Add(mynode);
    mynode.Tag=sqlreader.GetValue(1).ToString()+'|'+sqlreader.GetValue(2).ToString()+'|'+sqlreader.GetValue(3).ToString()+'|'+sqlreader.GetValue(0).ToString();
    NextTree(sqlreader.GetValue(0).ToString(),mynode);

    }

    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    finally
    {
    sqlcon.Close();
    }
               
    }
      

  7.   

    to zhehui(小慧):
    不是列出所有的顶级单位节点,而是根据给定的OrgID,列出有关系的单位,直到最上一级,也就是顶级单位。比如此时OrgID对应的是XX大学理学院,则列出如下的树形图:
    省教育厅
    ------XX大学
          ------XX大学理学院
    如果此时OrgID对应的是YY大学理,则列出如下的树形图:
    省教育厅
    ------YY大学
    此时就不列出有关XX大学的情况了。
    如果此时OrgID对应的是顶级单位,如省教育厅,则列出如下的树形图:省教育厅
      

  8.   

    用递推的方法根据给定的OrgID,推出所有的上级单位,将其存入一个ArrayList,
    以下是推导的过程:ArrayList a = new ArrayList();
    string strSql = string.Format("SELECT OrgID AS id, OrgName AS name, OrgNameUpperOrgID AS upID" + " From mytable WHERE OrgID = '{0}'", orgID);
    System.Data.DataSet ds = new System.Data.DataSet();
    ClearAndFillDataSet(ds, strSql, "org"); //执行strSql,将查询内容填入ds,表格名为“org”
    string upid = ds.Tables["org"].Rows[0]["upID"].ToString();
    int i = 0;

    while(upid != "0")
    {
        a.Add(ds.Tables["org"].Rows[0]["name"]);
        strSql = string.Format("SELECT OrgID AS id, OrgName AS name,
          NameUpperOrgID AS upID" + " From table1 WHERE OrgID = '{0}'", upid);
        ds = new System.Data.DataSet();
        ClearAndFillDataSet(ds, strSql, "org");
        upid = ds.Tables["org"].Rows[0]["upID"].ToString();
        i++;
    }

    ds = new System.Data.DataSet();
    strSql = string.Format("SELECT OrgID AS id, OrgName AS name, OrgNameUpperOrgID AS upID" + " From table1 WHERE OrgNameUpperOrgID = '{0}'", 0);
    ClearAndFillDataSet(ds, strSql, "org");
    a.Add(ds.Tables["org"].Rows[0]["name"]);可以根据a.Count来创建节点,最里层为顶极单位,越往外等级越低,a.Count为多少,
    就有几极
      

  9.   

    to[91bct(行人)] 
     你的意思是从下往上查。
     那在TreeView中只会出现一条从上到下的记录(对应) 如果是这样那:  
             string[] str=new string[100]; //足够大
             while (true)
             {
                ... select UpperOrgID from mytable where OrgID=提供的OrgID
                取得信息写入str  //树组中
                ...
                 break; //如果 UpperOrgID=0 退出
             }
             通过取得的信息(如单位名称 在树组str ) 写入 TreeView  参考......
      

  10.   

    while (true)
             {
                  如果 UpperOrgID!=0 则 当做 提供的OrgID          }
      

  11.   

    我的方法是定义一个继承自treeview的类。有dataview。根据当前的ID生成rowfilter调用一个递归函数。贴个vb的(结点类mytreenode继承自treenode)。    
    Private Sub FillTree(Optional ByRef pnode As myTreeNode = Nothing, Optional ByVal filter As String = "")
            mDataView.RowFilter = filter
            Dim i As Int32
            Dim newnode As myTreeNode
            For i = 0 To mDataView.Count - 1
                newnode = New myTreeNode(GetDisplay(i), GetValue(i), GetPid(i), GetCPtr(i))            If newnode.CPtr Then
                    '生成新的rowfilter
                    filltree(newnode,rowfilter)
                End If
                If pnode Is Nothing Then
                    Me.Nodes.Add(newnode)
                Else
                    pnode.Nodes.Add(newnode)
                End If
            Next
            mDataView.RowFilter = ""    End Sub
      

  12.   

    TO zhehui(小慧):哈哈,也有不明需求的情況:)
      

  13.   

    to zzc205():
    是应该用递推方法,谢谢你提供的方法。
    to yaoyaonet(绿洲):
    没错,上级是只有一个,下级就可以有多个。treeview上列出的是所有相关连的直接上级,直到顶级,而下级仅列出一层,就是说下级的下级就不再列出了。我试一下你的方法...非常感谢楼上几位兄弟的帮忙,等我试出来了就揭帖,分不够可以再加,
    我的可用分还有很多的。