外repeater:id为main1.用于显示分类
内repeater:id为main2.用于显示该分类下的信息列表因为用的无限级分类,且分类很多,用的是递归读取,所以首页执行很慢,所以决定后台先用dataset生成xml作为数据源进行读取。(分类为一个xml,每个分类下的列表信息各为一个xml)开始是是常用的方法 通过ItemDataBound获取main1的id读取信息,显示正常;然后都改成xml做为数据源:try
            {
                ds.ReadXml(Server.MapPath("xml/index_main1.xml"));
                main1.DataSource = ds;
                main1.DataBind();
                ds.Reset();
            }
            catch
            {
                ds = null;
            }这个是protected void main1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Repeater main2 = (Repeater)e.Item.FindControl("main2");            DataRowView view = (DataRowView)e.Item.DataItem;
            
            int CategorieId = Convert.ToInt32(view["ID"]);
            DataSet ds2 = new DataSet();
            main2.DataSource = ds2.ReadXml(Server.MapPath("xml/list/index_main1_" + CategorieId + ".xml")); ;
            main2.DataBind();
                    }
    }
结果只能显示第一个分类,而且里面的列表也不显示。后来我把main1的数据源改为dataset
把main1_ItemDataBound的注释掉,可以显示所有的分类(DataRowView view = (DataRowView)e.Item.DataItem;已经换成System.Data.Common.DbDataRecord view = (System.Data.Common.DbDataRecord)e.Item.DataItem;)
不注释就出现这个错误main2 使用的是无效数据源。有效数据源必须实现 IListSource 或 IEnumerable。main2.DataSource = ds2.ReadXml(Server.MapPath("xml/list/index_main1_" + CategorieId + ".xml"));这个应该可以看出内嵌注释掉了,外侧就可以循环了,这个是为什么?如果一定要2个地方都用xml做数据源 该怎么解决?

解决方案 »

  1.   

    在读内层的repeater的信息时非常慢
    因为该分类下又很多子分类,数据量多,最后还要在海量数据库里in操作
    所以感觉非常慢除了静态页我觉得xml暂时可以减轻点负担?
      

  2.   

    1、看清楚你这次加载页面到底连接了几次数据库,如果不是两次搞定数据源的,而是会根据数据量的增长几何增长的,说明你的代码编写存在严重的问题!
    2、确实是网页加载数量太多造成页面显示过慢,那就使用分页,减少加载的数量;
    3、使用XML和使用数据库都会消耗性能的,主要还是有效的利用内存;
      

  3.   

    回2楼的朋友:因为我这个是无限级分类,分类比较多,而且文章里的类别id都是最底层的id,我要显示的是最上层的类别,要显示其下的信息,所以我通过递归找出所有这个顶层分类下包含的最底层类别id,这个时候id必定有好多个了,所以查找信息用了in,in查找是要全表扫描的,所以in多了应该会耗很多资源,我查看是sqlserver这个进程这个时候站cpu非常大,换成xml是想不让他再从数据库读取,这个只是读操作了,应该会比较节省资源吧?3喽的朋友,如果用树控件的话还是要像我上面所说的读取数据库?这样不是还要sqlserver资源?我先去了解下树控件