TreeView在Page_Load事件中,初始化第一二级(也就是年级,班级),我想在TreeView1_TreeNodePopulate事件中,再列出班级下面的学生。
在MSDN中帮助,把EnableClientScript="True" 和PopulateNodesFromClient="True" 设置成="True" .还是不行。
InitTree在Page_Load事件事调用。代码如下:
 public void InitTree()
        {
            OracleDBClass.OraOracleDBClass db = new OracleDBClass.OraOracleDBClass();
            string strErr = "";
            DataSet ds = null;
            DataView dv_nj = new DataView(); //年级
            if (db.RunSQLReturnDataSet("select * from jw_t_bm_njbm", out ds, out strErr) == 1)
            {
                dv_nj.Table = ds.Tables[0];
                foreach (DataRowView drv in dv_nj)
                {
                    TreeNode tmpNd = new TreeNode();  
                    tmpNd.Value = drv["njbh"].ToString();
                    tmpNd.Text = " " + drv["njmc"].ToString() + " ";
                    //RootNd.ChildNodes.Add(tmpNd);
                    TreeView1.Nodes.Add(tmpNd);
                    //为年级添加班级
                    OracleDBClass.OraOracleDBClass db_bj = new OracleDBClass.OraOracleDBClass();
                    string strErr2 = "";
                    DataSet ds_bj = null;
                    DataView dv_bj = new DataView(); //班级
                    if (db.RunSQLReturnDataSet("select njbh,bjbh,bjmc from jw_t_bm_bjbm where njbh='"+tmpNd.Value+"'", out ds_bj, out strErr2) == 1)
                    {
                        dv_bj.Table = ds_bj.Tables[0];
                        foreach (DataRowView drv_bj in dv_bj)
                        {
                            TreeNode tmpNd_bj = new TreeNode();  
                            tmpNd_bj.Value = drv_bj["njbh"].ToString()+drv_bj["bjbh"].ToString();
                            tmpNd_bj.Text = "["+tmpNd_bj.Value+"] " + drv_bj["bjmc"].ToString() + " ";
                            //tmpNd.PopulateOnDemand = true;
                            tmpNd.ChildNodes.Add(tmpNd_bj);
                            
                        }
                    }
                }
            }
            else
            {
                Response.Write(strErr);
            }        }        protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            //
            if (e.Node.Depth == 1)
            {
                //
                  OracleDBClass.OraOracleDBClass db = new OracleDBClass.OraOracleDBClass();
                string strErr2 = "";
                DataSet ds = null;
                DataView dv = new DataView(); 
                if (db.RunSQLReturnDataSet("select xjh,name from jw_t_student where grade'" + e.Node.Value.Substring(1, 2) + "' and class='" + e.Node.Value.Substring(3, 2) + "'", out ds, out strErr2) == 1)
                {
                    dv.Table = ds.Tables[0];
                    foreach (DataRowView drv in dv)
                    {
                        TreeNode tmpNd = new TreeNode();
                        tmpNd.Value = drv["xjh"].ToString();
                        tmpNd.Text = "[" + drv["name"].ToString() + "] ";
                        e.Node.ChildNodes.Add(tmpNd);                    }
                }            }        }                            

解决方案 »

  1.   

    动态添加的TreeNode 回发的时候有没有再一次绑定?这里改改看看。
      

  2.   

    public void InitTree() 
            { 
                OracleDBClass.OraOracleDBClass db = new OracleDBClass.OraOracleDBClass(); 
                string strErr = ""; 
                DataSet ds = null; 
                DataView dv_nj = new DataView(); //年级 
                if (db.RunSQLReturnDataSet("select * from jw_t_bm_njbm", out ds, out strErr) == 1) 
                { 
                    dv_nj.Table = ds.Tables[0]; 
                    foreach (DataRowView drv in dv_nj) 
                    { 
                        TreeNode tmpNd = new TreeNode();  
                        tmpNd.PopulateOnDemand = True;
                        tmpNd.Value = drv["njbh"].ToString(); 
                        tmpNd.Text = " " + drv["njmc"].ToString() + " "; 
                        //RootNd.ChildNodes.Add(tmpNd); 
                        TreeView1.Nodes.Add(tmpNd); 
                        //为年级添加班级 
                        OracleDBClass.OraOracleDBClass db_bj = new OracleDBClass.OraOracleDBClass(); 
                        string strErr2 = ""; 
                        DataSet ds_bj = null; 
                        DataView dv_bj = new DataView(); //班级 
                        if (db.RunSQLReturnDataSet("select njbh,bjbh,bjmc from jw_t_bm_bjbm where njbh='"+tmpNd.Value+"'", out ds_bj, out strErr2) == 1) 
                        { 
                            dv_bj.Table = ds_bj.Tables[0]; 
                            foreach (DataRowView drv_bj in dv_bj) 
                            { 
                                TreeNode tmpNd_bj = new TreeNode();  
                                tmpNd_bj.Value = drv_bj["njbh"].ToString()+drv_bj["bjbh"].ToString(); 
                                tmpNd_bj.Text = "["+tmpNd_bj.Value+"] " + drv_bj["bjmc"].ToString() + " "; 
                                tmpNd.PopulateOnDemand = true; 
                                tmpNd.ChildNodes.Add(tmpNd_bj); 
                                
                            } 
                        } 
                    } 
                } 
                else 
                { 
                    Response.Write(strErr); 
                }         } 设置PopulateOnDemand=True才可以动态弹出
      

  3.   

    我加入以上两上PopulateOnDemand=True后,报错:
    PopulateOnDemand 在已具有子级的节点上不能设置为 true。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: PopulateOnDemand 在已具有子级的节点上不能设置为 true。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  
      

  4.   


    不好意思,这个地方有些问题,PopulateOnDemand只需要要设置在你加载的最后一级接点上,public void InitTree() 
            { 
                OracleDBClass.OraOracleDBClass db = new OracleDBClass.OraOracleDBClass(); 
                string strErr = ""; 
                DataSet ds = null; 
                DataView dv_nj = new DataView(); //年级 
                if (db.RunSQLReturnDataSet("select * from jw_t_bm_njbm", out ds, out strErr) == 1) 
                { 
                    dv_nj.Table = ds.Tables[0]; 
                    foreach (DataRowView drv in dv_nj) 
                    { 
                        TreeNode tmpNd = new TreeNode();  
                        // tmpNd.PopulateOnDemand = True;                     tmpNd.Value = drv["njbh"].ToString(); 
                        tmpNd.Text = " " + drv["njmc"].ToString() + " "; 
                        //RootNd.ChildNodes.Add(tmpNd); 
                        TreeView1.Nodes.Add(tmpNd); 
                        //为年级添加班级 
                           OracleDBClass.OraOracleDBClass db_bj = new OracleDBClass.OraOracleDBClass(); 
                        string strErr2 = ""; 
                        DataSet ds_bj = null; 
                        DataView dv_bj = new DataView(); //班级 
                        if (db.RunSQLReturnDataSet("select njbh,bjbh,bjmc from jw_t_bm_bjbm where njbh='"+tmpNd.Value+"'", out ds_bj, out strErr2) == 1) 
                        { 
                            dv_bj.Table = ds_bj.Tables[0]; 
                            foreach (DataRowView drv_bj in dv_bj) 
                            { 
                                TreeNode tmpNd_bj = new TreeNode();  
                                tmpNd_bj.Value = drv_bj["njbh"].ToString()+drv_bj["bjbh"].ToString(); 
                                tmpNd_bj.Text = "["+tmpNd_bj.Value+"] " + drv_bj["bjmc"].ToString() + " "; 
                                tmpNd.PopulateOnDemand = true; 
                                tmpNd.ChildNodes.Add(tmpNd_bj); 
                                
                            } 
                        } 
                    } 
                } 
                else 
                { 
                    Response.Write(strErr); 
                }         } 
      

  5.   

     drummery 是你个热心人!表示感谢。
    第一个地方的tmpNd.PopulateOnDemand = True; 确实要注释,这个是正确的。第二个地方,tmpNd.PopulateOnDemand = true; 应该改为:
    tmpNd_bj.PopulateOnDemand = true; 
    这样就正确了。
    我还发现一个问题:
    String myString = "abcdef";
    myString.Substring(1, 3)的值是"bcd"; //Substring方法中,字符位置的索引是从0开始
    substring(myString,1,3)的值是"abc"  //substring函数中,字符位置的索引是从1开始真是变态啊!!