TreeView在vs2005中数据库记录有5000多条,加载速度太慢,要10分钟,怎么解决?c#
代码如下:
 string str = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
            SqlConnection Conn = new SqlConnection(str);
            SqlDataAdapter myCommand = new SqlDataAdapter("SELECT * from 部门 where 是否人员='否' or 是否离职='是' order by 部门编号", Conn);
            DataSet ds = new DataSet();
            myCommand.Fill(ds);
            DataView dv = new DataView(ds.Tables[0]);
            dv.RowFilter = "分区编号= " + ParentID.ToString();
            foreach (DataRowView drv in dv)
            {
                TreeNode nod = new TreeNode();
                if (pNode == null)
                {
                    nod.Text = "(" + (drv["部门编号"].ToString()) + ")" + drv["部门名称"].ToString();
                    TreeView1.Nodes.Add(nod);
                    AddTree(drv["部门编号"].ToString(), nod);
                }
                else
                {
                    nod.Text = "(" + (drv["部门编号"].ToString()) + ")" + drv["部门名称"].ToString();
                    pNode.ChildNodes.Add(nod);
                    AddTree(drv["部门编号"].ToString(), nod);
                }
                TreeView1.CollapseAll();

解决方案 »

  1.   

    是否考虑第一次只加载根节点。点哪个节点就加载哪一层~~ 就像CSDN左边的树一样。
      

  2.   

    用datareader控件 \ 存储过程
    在数据库中建立视图,索引
      

  3.   

    而且你用DataSet一次性把数据全部取到本地内存里,是否考虑使用DataReader?
    一次取一部份?
      

  4.   

    网上搜一下xmlhttp做的异步树,较多的实例
      

  5.   

    请问怎么只用是DataReader对TreeView进行数据邦定?
      

  6.   

    楼主这里使用递归了吧。
    部门编号(0)
             +- 部门编号(1)
             |
             +- 部门编号(2) +- 部门编号(3)
             |              |
             |              +- 部门编号(4)
             |
             |
             +- 部门编号(5)
             |
    ...这样取出所有的5000条记录在那递归。
    我的意思是能不能一次只取一个节点下一层的数据。
    比如:第一次取 1, 2, 5
    如果点了2,我再取3, 4
    每次只取ParentID=N的数据。int intParentID = 3;
    SqlConnection conn = new SqlConnection(str);
    SqlCommand comm = new SqlCommand("SELECT * from 部门 where (是否人员='否' or 是否离职='是') and 分区编号=@ParentID order by 部门编号", conn);
    // 不知道你的 分区编号/部门编号 是什么类型的,瞎猜是
    comm.Parameters.Add("@ParentID", SqlDbType.Int).Value = intParentID;
    SqlDataReader dr = comm.ExecuteReader();
    while(dr.Read())
    {
       //...
    }
      

  7.   

    5000条,不可能要10分钟,程序写得有问题----循环里面套递归。看楼主好像用的VS2003(使用AppSettings放ConnectionString),那么享受不到2.0里的TreeView的特性了只有想其他办法了。==== 
    ~~~~ 我的Blog:http://blog.csdn.net/quou2002 
      

  8.   

    楼主,你在最后不是调用了 TreeView1.CollapseAll(); 么?也就是说,用户在刚进入此画面的时候,根本看不到下面的节点,对吧。换句话说,看不到就不用加载~~一开始只是显示一级部门节点+ 部门(0)
    + 部门(1)
    + 部门(2)当点击 部门(0) 的时候再加载 部门(0) 的子节点:- 部门(0)
       + 部门(01)
       + 部门(02)
       + 部门(03)
    + 部门(1)
    + 部门(2)这样逐级加载。当然你必须在 TreeView.BeforeExpand 事件
    中去加载该节点的子节点。
      

  9.   

    如果是Web开发,使用Web的Treeview控件,那么应该在点击 + 这个图片的客户端事件里postback一次,查一次数据库。
      

  10.   

    使用ajax 每次只加载需要的数据
    http://www.aspxboy.com/code
    看左边 有源码
      

  11.   

    fangxinggood(JustACoder你的思路很好呀,我要参考参考!顶