首页 新闻 会员 周边

net树结构刷新问题

0
悬赏园豆:40 [已解决问题] 解决于 2009-11-24 16:30

树结构是分别从4张表里取出来的,全放在viewstate中,数据少没问题,要是树的第4层有2000多个节点,刷一次,页面就卡死,1分多钟后正常。创建树的方法执行是3秒中,更改图片是1秒钟,首次访问正常,刷新为什么显示页面会卡死啊,1分多钟后正常。2台机子都是这样,刷新我只执行了换图片的方法,快救人啊

在pageload中的

if(!ispostback)

{

  ........

  createTreeView()

//createTreeView()中再调用二级节点的方法,依此类推,共4层

}

else

{

//用timer控件,每1分钟刷一次,更新树的图片

   UpdateTreeViewImg();

}

 

  private void UpdateTreeViewImg()
    {

        List<Model.c_unend_alarm> sAlarmList = new List<Model.c_unend_alarm>();
        sAlarmList = TreeBll.GetUnendAlarm();
        foreach (TreeNode tn_area in this.TreeView1.Nodes)
        {
            string aid = (tn_area.Value).ToString();
            foreach (TreeNode tn_group in tn_area.ChildNodes)
            {
                int a = 0;
                foreach (TreeNode tn_bureau in tn_group.ChildNodes)
                {
                    int b = 0;
                    foreach (TreeNode tn_device in tn_bureau.ChildNodes)
                    {
                        int c = 0;
                        string b_dID = (tn_device.Value).ToString();
                        string[] arry = b_dID.Split('*');
                        for (int i = 0; i < sAlarmList.Count; i++)
                        {

                            if (Convert.ToInt32(arry[0]) == sAlarmList[i].Device_id && Convert.ToInt32(arry[1]) == sAlarmList[i].Bureau_id && Convert.ToInt32(aid) == sAlarmList[i].Area_id)
                            {
                                tn_device.ImageUrl = "Web_Img/Alarm/red.gif";
                                tn_bureau.ImageUrl = "Web_Img/Alarm/red.gif";
                                tn_group.ImageUrl = "Web_Img/Alarm/red.gif";
                                a++;
                                b++;
                                c++;
                                break;
                            }
                        }
                        if (c == 0)
                        {
                            tn_device.ImageUrl = "Web_Img/Alarm/green.gif";
                        }
                    }
                    if (b == 0)
                    {
                        tn_bureau.ImageUrl = "Web_Img/Alarm/green.gif";
                    }
                }
                if (a == 0)
                {
                    tn_group.ImageUrl = "Web_Img/Alarm/green.gif";

                }
            }
        }

}

 

 public void CreateTree()
    {
        List<Model.c_area_info> Arealist = (List<Model.c_area_info>)ViewState  ["Arealist"];

               
        for (int i = 0; i < Arealist.Count; i++)
        {
            Model.c_area_info AreaModel = new Model.c_area_info();
            AreaModel = Arealist[i];
            TreeNode Fnode = new TreeNode();
            Fnode.Text = (AreaModel.Area_name).ToString();
            Fnode.Value = (AreaModel.Area_id).ToString();
            Fnode.Target = "right";
           
            this.TreeView1.Nodes.Add(Fnode);
            CreateChildNode(Convert.ToInt32(Fnode.Value), Fnode);
        }
    }

问题补充: 谢谢大家的回答,我把viewstate清空,甚至把更新图片的方法除掉,treeview刷新还是会造成页面卡死 难道是和treeview节点的多少有关?
ghelement的主页 ghelement | 初学一级 | 园豆:20
提问于:2009-11-20 12:12
< >
分享
最佳答案
0

创建node的时候设置value值,然后用tree的FindNode方法,按需更新。

收获园豆:30
tearsofpk | 菜鸟二级 |园豆:300 | 2009-11-20 14:53
谢谢你的答案,那我怎么获得他的上级节点?
ghelement | 园豆:20 (初学一级) | 2009-11-20 15:04
有点头绪了,试下先
ghelement | 园豆:20 (初学一级) | 2009-11-20 15:06
你只要从数据库里取出需要更新的节点的路径值,然后通过FindNode查找此结节. 举个例子,如下树结构: a --b --c 定义其值如 a.value="aa";b.value="bb";c.value="cc"; 那么要查找结点c的就是这样了,treenode n = tv.findnode("aa/bb/cc");
tearsofpk | 园豆:300 (菜鸟二级) | 2009-11-20 15:40
其他回答(4)
0

不要这样来处理, 用ajax从服务器取得要更新的内容, 用javascript来更新

风浪 | 园豆:2996 (老鸟四级) | 2009-11-20 12:25
0

msdn对viewstate性能的:

必要时保存服务器控件视图状态 自动视图状态管理使服务器控件可以在往返行程中重新填充它们的属性值,而您不需要编写任何代码。但是,因为服务器控件的视图状态在隐藏的窗体字段中往返于 服务器,所以该功能影响性能。了解在哪些情况下视图状态会有所帮助,在哪些情况下它影响页的性能,这样是有帮助的。例如,如果您将服务器控件绑定到每个往 返行程上的数据,因为控件的值会在数据绑定期间用新值替换,所以保存的视图状态没有用处。在这种情况下,禁用视图状态可以节省处理时间并减少页的大小

 

从上面,lz应该知道2000多条数据不做任何处理放在viewstate里面,对于页面数据传输及其处理是有多大的压力,建议楼主用以下几种方案解决:

 一压缩viewstate的数据。

 二用ajax异步读取数据,而不是所有的都读出来放在viewstate中

收获园豆:10
persialee | 园豆:3217 (老鸟四级) | 2009-11-20 12:40
想进一步了解下,在我树形结构创建完后,我就不需要viewstate里的数据了,那我可以把viewstate里清空吗?
支持(0) 反对(0) ghelement | 园豆:20 (初学一级) | 2009-11-20 13:29
0

ViewState很慢的 用js吧

码尔代夫iimax | 园豆:3138 (老鸟四级) | 2009-11-20 13:39
0

嵌套了这么多的循环,又是树结构不卡才怪呢,建议每次只读取一级节点,当用户点击根节点展开的时候再读取该节点下的内容,也就是点什么,加载什么,这样子的话就不会你这么卡了,另外可以多用前台脚本去弄,减少FWQ端的压力

死神的背影 | 园豆:667 (小虾三级) | 2009-11-20 13:46
嵌套的循环是找节点下的子节点,有与数据库匹配的节点就换图片,要求就是要1分钟刷一次。要是我把节点全点开了,数据库有了新的数据,那你这方法就更新不了图片了
支持(0) 反对(0) ghelement | 园豆:20 (初学一级) | 2009-11-20 14:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册