如何将类似图一的表,动态生成得到类似图二的树?
给思路就好,千恩万谢,一定给分。
图一的链接:http://vchelp.net/ASP/cdf_pic/200505/reply_1_890109.jpg
图二的连接:http://vchelp.net/ASP/cdf_pic/200505/reply_1_890108.jpg

解决方案 »

  1.   

    这个很简单呀
    第一层:
    TreeView1.Nodes.Add(node)下一层:TreeView1.Node[i].Nodes.Add(node)
      

  2.   

    我的答案:
    方法:用SQLCommand + DataReader + while循环完成.DataReader drName = NameSQLCommand.ExcuteReader();
    //NameSQLCommand这个命令中有Select distinct rjb_name from XXXtable
    while(string mame = drName.Read())
    {
         TreeNode node = new Treenode(name);
         TreeView1.Nodes.Add(node);
          DataReader drYear = YearSQLCommand.ExcuteReader();
         //这个SQL命令里要有Select distinct rjb_year from XXXtable where rjb_name = @name
         while(....)
         {
               //这里面是月的...
         }
         
    }
      

  3.   

    应该建立几个单独的函数来实现generaterb_name (TreeNode node,string strname) //负责生成姓名节点generaterb_year (TreeNode node,string year) //负责生成年份节点generaterb_month (TreeNode node,string month)  //负责生成月份节点generaterb_day (TreeNode node,string day) //负责生成日期节点然后分别循环调用就OK
      

  4.   

    说白了就是建一个数据表,其中有编号,父节点,内容。然后读取这个表内容,把子节点添加到相应的父接点上。在C#里没写这样的。但是可以给你一个我在C++下写的一个生成树的代码,希望对你有所帮助!
    //这个函数是生成树接点。
    void TForm10::AddClass(int AId,TTreeNode *FatherNode)
    {
            TADOQuery *QryTmp;
            TTreeNode *myNode;
            TLabel *myLabel;
            CheckCon();
            QryTmp=new TADOQuery(this);
            QryTmp->Connection=this->ADOConnection1;
            QryTmp->Close();
            QryTmp->SQL->Clear();
            QryTmp->SQL->Add("select * from bjinfo");
            QryTmp->SQL->Add("where fatherid="+IntToStr(AId));
            QryTmp->Open();
            while(!QryTmp->Eof)
            {
                    myNode=TreeView1->Items->AddChild(FatherNode,QryTmp->FieldByName("bjmc")->AsString);                myLabel=new TLabel(this);
                    myLabel->Visible=false;
                    myLabel->Caption=QryTmp->FieldByName("bjbh")->AsString;
                    myNode->Data=myLabel;
                    AddClass(QryTmp->FieldByName("bjbh")->AsInteger,myNode); //递归调用过程
                    QryTmp->Next();
            }
            delete QryTmp;}
    //首次调用加载
    AddClass(0,NULL);  
      

  5.   

    1、先把数据一次选出来
    select * from rjb order by rjb_id,rjb_name,rjb_year,rjb_month,rjb_day
    2、逐个判断Name/Year/Month/Day是否相等,对应添加各级节点;
      

  6.   

    private TreeNode GetNameNode(string name)
    {
    // 遍历第一级节点,有name则返回该节点,没有创建新的节点并返回。
    }
    private TreeNode GetYearNode(string year, TreeNode nameNode)
    {
    // 遍历nameNode下的所有二级节点,有year则返回该节点,没有创建新的节点并返回。
    }
    ......
      

  7.   

    多谢几位的提点,我写了如下代码,全在page_load里面了,但生成的图仍有所不对,麻烦见图,因为3层嵌套,把我完全搞晕了。
    图的链接:http://vchelp.net/ASP/cdf_pic/200505/reply_1_890465.jpg
    代码如下:private void Page_Load(object sender, System.EventArgs e)
    { SqlConnection cnn;
    cnn=new SqlConnection("data source=(local);initial catalog=rqb;integrated security=SSPI");
    cnn.Open(); DataSet ds=new DataSet ();
    SqlDataAdapter cmName;
    SqlDataAdapter cmYear;
    SqlDataAdapter cmMonth;
    TreeNode nodeName;
    TreeNode nodeYear;
    TreeNode nodeMonth; cmName=new SqlDataAdapter("select distinct day_emp_name from rqb_day", cnn);
    cmName.Fill(ds, "Name");

    foreach(DataRow rowName in ds.Tables ["Name"].Rows )
    {
    nodeName=new TreeNode ();
    nodeName.Text=rowName["day_emp_name"].ToString ();
    TreeView1.Nodes.Add(nodeName);
      
    cmYear=new SqlDataAdapter("select distinct day_year,day_emp_name from rqb_day where day_emp_name='"+nodeName.Text+"'",cnn);
    cmYear.Fill(ds,"Year"); foreach(DataRow rowYear in ds.Tables ["Year"].Rows )
    {
    nodeYear=new TreeNode ();
    if(rowYear["day_emp_name"].ToString()==nodeName.Text )
    {
    nodeYear.Text=rowYear["day_year"].ToString ();
    nodeName.Nodes.Add(nodeYear); } cmMonth=new SqlDataAdapter("select distinct day_month,day_year from rqb_day where day_year='"+nodeYear.Text+"'",cnn);
    cmMonth.Fill(ds,"Month"); foreach(DataRow rowMonth in ds.Tables ["Month"].Rows )
    {
    nodeMonth=new TreeNode ();
    if(rowMonth["day_year"].ToString ()==nodeYear.Text )
    {
    nodeMonth.Text =rowMonth["day_month"].ToString ();
    nodeYear.Nodes.Add (nodeMonth);
    }
    } }
    }
    }
      

  8.   

    一条语句select * from rqb_day就够了,遍历每条记录,调用我写的方法就行了。
    for(int i = 0 ; i < dataTable.Rows.Count ; i ++)
    {
      string name = dataTable.Rows[i]["name"].ToString();
      string year = dataTable.Rows[i]["year"].Tostring();
      string month = dataTable.Rows[i]["month"].ToString();
      TreeNode node = GetNameNode(name);
      node = GetYearNode(year, node);
      node = GetMonthNode(month, year);
      ......
    }
      

  9.   

    这个不是很难啊
    用treeview控键
    然后在后台写一个循环,(我是用foreach来做的)
    动态的生成你要的树型结构就行了
    private void Init_Data()
    {
    if(Request.Cookies["drpcookie"]==null)
    {
    Response.Redirect("Limit.htm");
    }
    Microsoft.Web.UI.WebControls.TreeNode rootnode = new Microsoft.Web.UI.WebControls.TreeNode();
    rootnode.Expanded = true;
    TreeView1.Nodes.Add(rootnode);

    HttpCookie cookie=this.Request.Cookies["drpcookie"];
    string level=cookie.Values["level"];
    rootnode.Text="**********";
    string tem = conn.GetUserLevel(level);
    CreateTree(tem,0, rootnode);
    } private void CreateTree(string visible,int belong, Microsoft.Web.UI.WebControls.TreeNode rootnode)
    {
    SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["Connection"]);
    string strSql;
    //strSql="select * from tree where belong="+@belong+"and "+@visible+"=1";
    strSql="select * from tree,"+visible+" where tree.id="+visible+".id and tree.belong="+@belong+"and "+visible+".visible<>0"; 
    //"+@visible+"=1";
    SqlCommand cmd=new SqlCommand(strSql,connection);
    cmd.CommandTimeout = 30;
    SqlDataAdapter custDA = new SqlDataAdapter();
    custDA.SelectCommand = cmd;
    connection.Open();
    DataSet ds = new DataSet();
    custDA.Fill(ds,"tree");

    foreach(DataRow dr in ds.Tables[0].Rows)
    {
    Microsoft.Web.UI.WebControls.TreeNode treenode = new Microsoft.Web.UI.WebControls.TreeNode();
    treenode.Text = dr["text"].ToString().Trim();
    treenode.NavigateUrl = dr["url"].ToString().Trim();
    treenode.Target = "fraRightFrame";
    // treenode.CheckBox = true;
    // treenode.Expanded = false;
    rootnode.Nodes.Add(treenode);
    int id = int.Parse(dr["id"].ToString().Trim());
    CreateTree(visible,id, treenode);

    }
    ds.Clear();
    connection.Close();
    }这个是我以前动态生成树的程序
    你做个参考吧!
      

  10.   

    谢谢各位的指点之恩,最后的代码如下,方便后来的人查询:foreach(DataRow rowName in ds.Tables ["Name"].Rows )
                {
                    nodeName=new TreeNode ();
                    nodeName.Text=rowName["day_emp_name"].ToString ();
                    TreeView1.Nodes.Add(nodeName);
      
                    cmYear=new SqlDataAdapter("select distinct day_year from rqb_day where day_emp_name='"+nodeName.Text+"'",cnn);
                    cmYear.Fill(ds,"Year");                foreach(DataRow rowYear in ds.Tables ["Year"].Rows )
                    {
                        nodeYear=new TreeNode ();
                        nodeYear.Text=rowYear["day_year"].ToString ();
                        nodeName.Nodes.Add(nodeYear);
                        //****加入当前人年份内月份记录
                        cmMonth=new SqlDataAdapter("select distinct day_month from rqb_day where day_year='"+nodeYear.Text+"' and day_emp_name='"+nodeName.Text+"'",cnn);
                        cmMonth.Fill(ds,"Month");
                        foreach(DataRow rowMonth in ds.Tables ["Month"].Rows )
                        {
                            nodeMonth=new TreeNode ();
                            nodeMonth.Text =rowMonth["day_month"].ToString ();
                            nodeYear.Nodes.Add (nodeMonth);
                            //****加入当前人年份内月份内日期记录
                            cmYear=new SqlDataAdapter("select distinct day_day from rqb_day where day_year='"+nodeYear.Text+"' and day_emp_name='"+nodeName.Text+"' and day_month='"+nodeMonth.Text+"'  ",cnn);
                            cmYear.Fill(ds,"Day");
                            foreach(DataRow rowDay in ds.Tables ["Day"].Rows )
                            {
                                nodeDay=new TreeNode ();
                                nodeDay.Text =rowDay["day_day"].ToString ();
                                nodeMonth.Nodes.Add (nodeDay);
                            }                        ds.Tables["Day"].Clear();
                            
                        }                    ds.Tables["Month"].Clear();                }
                      ds.Tables["Year"].Clear();
                    
                    //
                                    //    }
                }