树结构是分别从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);
}
}
创建node的时候设置value值,然后用tree的FindNode方法,按需更新。
不要这样来处理, 用ajax从服务器取得要更新的内容, 用javascript来更新
msdn对viewstate性能的:
必要时保存服务器控件视图状态 自动视图状态管理使服务器控件可以在往返行程中重新填充它们的属性值,而您不需要编写任何代码。但是,因为服务器控件的视图状态在隐藏的窗体字段中往返于 服务器,所以该功能影响性能。了解在哪些情况下视图状态会有所帮助,在哪些情况下它影响页的性能,这样是有帮助的。例如,如果您将服务器控件绑定到每个往 返行程上的数据,因为控件的值会在数据绑定期间用新值替换,所以保存的视图状态没有用处。在这种情况下,禁用视图状态可以节省处理时间并减少页的大小
从上面,lz应该知道2000多条数据不做任何处理放在viewstate里面,对于页面数据传输及其处理是有多大的压力,建议楼主用以下几种方案解决:
一压缩viewstate的数据。
二用ajax异步读取数据,而不是所有的都读出来放在viewstate中
ViewState很慢的 用js吧
嵌套了这么多的循环,又是树结构不卡才怪呢,建议每次只读取一级节点,当用户点击根节点展开的时候再读取该节点下的内容,也就是点什么,加载什么,这样子的话就不会你这么卡了,另外可以多用前台脚本去弄,减少FWQ端的压力