我想做一个treeview的分级下载
比如说:
    教委
      清华
        计算机
           一班
             张三
             李四
           二班
      北大
        文法
          1班
           王五
           赵六数据库中,有三张表,一张是学校名,一张是所有学校的所有院系(每个院系有个学校代码),还有一张班级列表(有院系代码)
我是根据treeview1.selectednode.depth来判断,是哪一个级别的,到对应的表中去读取,目前点击学校名可以加载院系,但是如果在点击院系会在判断深度的时候报错
switch (TreeView1.SelectedNode.Depth.ToString())这句话报错,说对象没有实例化代码如下
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        OracleConnection conn = new OracleConnection();
        conn.ConnectionString = "data source=School;user id=School;password=School";        conn.Open();        switch (TreeView1.SelectedNode.Depth.ToString())
        {
            case "1":
                string tmp1 = TreeView1.SelectedNode.Text;
                string sql = "select DXBH from DX_DMB where DXMC ='" + tmp1 + "'";
                OracleDataAdapter dataAdapterDP1 = new OracleDataAdapter(sql, conn);
                DataSet dsDP1 = new DataSet();
                dataAdapterDP1.Fill(dsDP1);
                string tmpDXBH = dsDP1.Tables[0].Rows[0]["DXBH"].ToString();                string sql2 = "select YXMC from YX_DMB where DXBH = '" + tmpDXBH + "'";
                OracleDataAdapter dataAdapterDP12 = new OracleDataAdapter(sql2, conn);
                DataSet dsDP12 = new DataSet();
                dataAdapterDP12.Fill(dsDP12);                if (dsDP12.Tables["table"].Rows.Count != 0)
                {
                    for (int i = 0; i < dsDP12.Tables["table"].Rows.Count; i++)
                    {
                        TreeNode nodeYX = new TreeNode();
                        nodeYX.Text = dsDP12.Tables[0].Rows[i]["YXMC"].ToString();
                        TreeView1.SelectedNode.ChildNodes.Add(nodeYX);
                        TreeView1.SelectedNode.Expanded = true;
                    }
                    TreeView1.DataBind();
                }
                break;            case "2":
                break;
        }点击清华,因为depth=1,所以会进入case "1",然后加载院系,但是再点击加载后的院系的名称就会报错

解决方案 »

  1.   

    Depth.ToString()换成level
    根节点是0
    类推
      

  2.   

    怀疑 是不是在新增节点后,TreeView1.SelectedNode变成了新增的那个节点!
      

  3.   

    真是奇怪
    鼠标能点到,就说明TreeView1.SelectedNode.Depth有值.就不应该报对象没实例化.还都一点不明白,为什么要加 TreeView1.DataBind(); 页面刷新后,节点就会显示,为什么还要DataBind?你试试重新生成网站试试,我遇到怪问题都是这么解决的
      

  4.   

    回楼上,重新生成没用阿,一开始是没有用databind,我也是在尝试
      

  5.   

    发个例子  可以参考下
    private void uwtTemplate_AddNodes()
    {
    int i;
    Node clsNode;
    UltraWebTree uwtTemplate; if (mdsTemplateLayer.Tables.Count <= 0)
    {
    return;
    } uwtTemplate = (UltraWebTree)this.wgbTemplate.FindControl("uwtTemplate");

    mdsTemplateLayer.Tables[0].DefaultView.RowFilter = "LNUM=1"; for(i=0;i<mdsTemplateLayer.Tables[0].DefaultView.Count;i++)
    {
    clsNode = new Node(); clsNode.Text = mdsTemplateLayer.Tables[0].DefaultView[i]["L_NAME"].ToString();
    clsNode.Tag = mdsTemplateLayer.Tables[0].DefaultView[i]["L_CODE"]; uwtTemplate.Nodes.Add(clsNode); this.Recursion_TemplateNodesAdded(2,clsNode);
    } uwtTemplate.ExpandAll();
    } private void Recursion_TemplateNodesAdded(int intLNum,Node clsNode)
    {
    int i;
    Node clsChildNode;
    DataTable dtTemplateLayer; if (mdsTemplateLayer.Tables.Count <= 0)
    {
    return;
    } dtTemplateLayer = mdsTemplateLayer.Tables[0].Copy(); dtTemplateLayer.DefaultView.RowFilter = "LNUM=" + intLNum + " AND L_CODE LIKE '" + clsNode.Tag.ToString() + "%'"; for(i=0;i<dtTemplateLayer.DefaultView.Count;i++)
    {
    clsChildNode = new Node(); clsChildNode.Text = dtTemplateLayer.DefaultView[i]["L_NAME"].ToString();
    clsChildNode.Tag = dtTemplateLayer.DefaultView[i]["L_CODE"]; clsNode.Nodes.Add(clsChildNode);

    this.Recursion_TemplateNodesAdded(intLNum+1,clsChildNode);
    }
    }
      

  6.   

    TreeNode rootNodeOfClassA = treeView1.Nodes[0];             
    foreach (TreeNode nodeOfClassB in rootNodeOfClassA.Nodes)        
    foreach (TreeNode nodeOfClassC in nodeOfClassB.Nodes)用这种方式去获取  节点的值 , 再进行向数据库里查询, 在用同样的方法 Add进去
      

  7.   

    我总觉得好像问题是出在楼主没有贴出来的代码里面...
    建议楼主不要把焦点范围搞得太小,把与此相关的代码都检查一遍,很可能是其它什么事件把SelectedNode给清空掉了.
      

  8.   

    給你個Infragistics中的Tree的例子看看 類似 protected void treeDept_NodeSelectionChanged(object sender, WebTreeNodeEventArgs e)
        {
            e.Node.Nodes.Clear();        string ibo = Convert.ToString(treeDept.SelectedNode.Tag);//treeDept樹的名稱
            DataTable dt = new DataTable();        dt = new CIMUserUCO().GetUserSelect(ibo);//得到資料
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Node node = new Node();
                    if (!string.IsNullOrEmpty(Convert.ToString(dt.Rows[i]["USER_GUID_COUNT"])))
                    {
                        node.Text = Convert.ToString(dt.Rows[i]["NAME"]) + "<font color='Red'>(" + Convert.ToString(dt.Rows[i]["USER_GUID_COUNT"]) + ")</font>";
                    }
                    else
                    {
                        node.Text = Convert.ToString(dt.Rows[i]["NAME"]);
                    }
                    e.Node.Nodes.Add(node); 
                    treeDept.ExpandAll();
                }
            }
            
        }