1,WINFORM的程序,我的treeview是直接从数据库获取,里面许多节点以及好多子节点,如果在窗体一开始就载入需要耗费一定的时间,我现在想窗体加载的时候只加载前面两层,然后每点击一个节点的时候就加载这个节点的子节点。试问怎么实现?2,还有一个问题是,大家都知道treeview默认的是如果这个节点有子节点的话,那么该节点就会有一个+号,如果按照第一个问题窗体只加载到前面2层,当我点击第二层节点的时候即使该节点还有子节点可能也无法显示+号(因为代码还未去检索该节点是否有无子节点),有什么好的方案可以解决这问题吗?30分送上,虽不多,但是找了许多资料都没有要到满意的答案,谢谢指点!

解决方案 »

  1.   

    我不知道你的树是怎么写的  
    但是我写这个好使  就是你说的那样 参考下吧 private void nodes(TreeNodeCollection tnode, DataTable dt, int id)
            {
                DataView dv = new DataView(dt);
                dv.RowFilter = "[ParentAreaID]=" + id + "";
                foreach (DataRowView row in dv)
                {
                    TreeNode node = new TreeNode();
                    node.Text = row["AreaName"].ToString();
                    tnode.Add(node);
                    nodes(node.Nodes, dt, Int32.Parse(row["AreaID"].ToString()));
                }
            }private void FormAreaType_Load(object sender, EventArgs e)
            {
                DataTable dt = objDB.get_DataTable("select * from Kxd_AreaType");
                nodes(this.treeView1.Nodes, dt, 0);
                button1.Select();
            }
      

  2.   

    在BeforeExpand里头做
    展开本节点的时候,为本节点的所有Nodes获取子节点foreach(TreeNode node in e.Node.Nodes)
    {
        //为Node添加子节点
    }
      

  3.   

    1 从数据库把第1层的节点查询结果到datatable1,循环datatable1的记录增加节点treeview.items.add(datatable1.rows(i)(名称)),然后再循环datatable1的记录,查询出每个第1层下的第2层结果到datatable2,循环datatable2记录增加节点到treeview.  (当然预先用节点主键排好序就不用循环多次,一次就可以添加2层或多层节点)
    2 点击第二层节点的时候即使该节点还有子节点可能也无法显示+号,原因就是你没把子节点加入到treeview。你在点击的事件中加入代码,从数据库判断该节点下是否有子节点,如果有则把子节点加入到该节点下,刷新,就会出现+号了。
      

  4.   

    回复第二个问题:你只需要查询是否有子数据(对于t-sql语句就是“if(exists(select * from..... where ....))then select 1 else select 0”),如果返回1则增加一个“假的”节点(例如值为特定的结果)。当节点展开时,判断当子节点只有1个并且值为假节点数据时,删除这个节点并装载真正的子节点。