我前两天发了个帖子,我的数据表是gx表,里面就两列数据,fth(父图号)和zth(子图号),例如 
fth        zth 
中国      浙江 
中国      湖北 
浙江      杭州 
浙江      宁波 
杭州      余杭 
杭州      萧山 
······ web程序中有个textbox1和treeview1,在textbox1中输入父图号值,点button,treeview中就会显示相应内容。例如在textbox1中输入“浙江”,treeview1就会显示“ 
    浙江 
        杭州 
          余杭 
          萧山 
        宁波 
这当然只是个例子,我照高手们的意见写完了下面的代码,但是运行的时候却看不到treeview1,请问下是怎么回事?(visible=true了)
protected void TreeView1_Load(object sender, EventArgs e)
    {
       TreeView1.Nodes.Clear();   
       string sqlname = "SELECT fth,zth from gx where fth='HW69090701'";
       SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnString1"]);
       SqlCommand cmd = new SqlCommand(sqlname, cn);
       SqlDataAdapter da = new SqlDataAdapter(cmd);
       DataSet ds = new DataSet();
       da.Fill(ds,"gx");  
      DataTable dt = ds.Tables[0];                         foreach (DataRow dr in dt.Rows) 
            { 
                    if (dr["fth"].ToString()=="HW69090701")                { 
                    TreeNode newNode = new TreeNode(dr["fth"].ToString()); 
                    TreeView1.Nodes.Add(newNode);                     ChildLoad(dr, newNode, dt); 
                }                
            }             this.TreeView1.ExpandAll();          }
    private void ChildLoad(DataRow dr, TreeNode newNode, DataTable dt) 
        { 
            foreach (DataRow row in dt.Rows) 
            { 
                if (dr["fth"] == row["zth"]) 
                { 
                    TreeNode childNode = new TreeNode(); 
                    childNode.Text = row["zth"].ToString(); 
                    //newNode.Nodes.Add(childNode);
                    newNode.ChildNodes.Add(childNode);                    ChildLoad(row, childNode, dt);                 } 
            } 
        }

解决方案 »

  1.   

    TreeView1_Load 这句话有问题 你应该把加载树的方法写到 页面初始里面
      

  2.   

    我把TreeView1_Load里的代码剪切到 protected void Page_Load(object sender, EventArgs e)里,也还是看不见
      

  3.   

    代码如下:(运行的时候其他控件都能看到,就是treeview1看不到,SQL语句查出来是有数据的) protected void Page_Load(object sender, EventArgs e)
        {        TreeView1.Nodes.Clear();    //先清空树 
            TreeView1.Visible = true;
            SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnString1"]);
            string sqlname = "SELECT fth,zth from gx where fth='HW69090701'";
            SqlCommand cmd = new SqlCommand(sqlname, cn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds, "gx");
            DataTable dt = ds.Tables[0];
            //循环绑定父节点 
            foreach (DataRow dr in dt.Rows)
            {
                //遍历加载父节点 
                if (dr["fth"].ToString() == "HW69090701")
                {
                    TreeNode newNode = new TreeNode(dr["fth"].ToString());
                    TreeView1.Nodes.Add(newNode);                ChildLoad(dr, newNode, dt);
                }
            }        this.TreeView1.ExpandAll();    }    private void ChildLoad(DataRow dr, TreeNode newNode, DataTable dt)
        {
            foreach (DataRow row in dt.Rows)
            {
                if (dr["fth"] == row["zth"])
                {
                    TreeNode childNode = new TreeNode();
                    childNode.Text = row["zth"].ToString();
                    newNode.ChildNodes.Add(childNode);                ChildLoad(row, childNode, dt);  //递归子节点 
                }
            }
        }
      

  4.   

    注意你的命令:"SELECT fth,zth from gx where fth='HW69090701'"
    而你的循环中:if (dr["fth"].ToString()=="HW69090701") 这里为何要再次判断呢?你SQL语句不是过滤掉了吗?
    而且你的递归代码没看到你加载其子树数据的代码。
    举个例子:
    你的SQL语句检索出的数据
    中国 浙江
    中国 广东这里没有浙江的子树数据,而且你递归代码里也没有加载数据,请问你何处得到这个树呢?
      

  5.   

    楼主你好,刚上论坛看到了你的留言。
    楼上的帖子我看了一下。#14楼说的有道理,你应该确保取出的有fth="HW69090701"的数据,如果没有的话第一层的父节点就不存在,下面的递归肯定也取不到。1.查询语句改为"SELECT fth,zth from gx"
    2.遍历加载你节点时:
    TreeNode newNode = new TreeNode(dr["fth"].ToString()); ==>TreeNode newNode = new TreeNode(dr["zth"].ToString()); 
    3.递归的方法ChildLoad()中:
    if (dr["fth"] == row["zth"]) ==>if (dr["zth"] == row["fth"])另外,如果你写在Form_Load里,最好加上ispostback判断
      

  6.   

    camperer,我按照你的改了,没有写在Form_Load,写在button1里,但运行时点击还是没有数据,我再把改好的代码放在下面,各位大虾们帮我看看问题出在哪里?
     protected void Button1_Click(object sender, EventArgs e)
        {
            TreeView1.Nodes.Clear();    //先清空树 
            TreeView1.Visible = true;
            SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnString1"]);
            string sqlname = "SELECT fth,zth from gx";
            SqlCommand cmd = new SqlCommand(sqlname, cn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds, "gx");
            DataTable dt = ds.Tables[0];        foreach (DataRow dr in dt.Rows)
            {
                if (dr["fth"].ToString() == "HW69090701")
                {
                    TreeNode newNode = new TreeNode(dr["zth"].ToString());
                      TreeView1.Nodes.Add(newNode);
                     ChildLoad(dr, newNode, dt);
                }
            }        this.TreeView1.ExpandAll();
        }
    private void ChildLoad(DataRow dr, TreeNode newNode, DataTable dt)
        {
            foreach (DataRow row in dt.Rows)
            {
                    if (dr["zth"] == row["fth"]) 
                {
                    TreeNode childNode = new TreeNode();
                    childNode.Text = row["zth"].ToString();
                    newNode.ChildNodes.Add(childNode);
                    ChildLoad(row, childNode, dt);  //递归子节点 
                }
            }
        }
      

  7.   

    if (dr["zth"] == row["fth"]) 
    这里都加上.ToString()。上面的代码应该没有问题。
    1.你检查下数据库里是否有fth="HW69090701"的数据存在。
    2.页面上TreeView1的各级父容器,有没有visible=false或者style="display:none"的。你把aspx页面的代码也贴上来看看吧。
      

  8.   

    其实你可以用排除法的,先不要绑定,在aspx页手动添加一个静态的节点看TreeView是否显示,如果不显示就是前台页面的问题,如果显示就是cs代码中的问题。
    确认了是绑定代码的问题的话,你也先不要绑定,用代码添加一个节点TreeView1.Nodes.Add(new TreeNode("...")),看是否显示。
      

  9.   

    camperer,你好:
    1)静态的treeview运行时是可以显示的;
    2)数据库里有fth='HW69090701'的数据存在;
    3)用代码添加一个节点是显示的;
    4)if (dr["zth"] == row["fth"]) 改成if (dr["zth"].ToString() == row["fth"].ToString())但运行还是没有结果。帮忙再看下。