控件的Visible设为false后,ViewState是否visible?

    在有很多地方为了方便需要在页面上放很多的控件,用panel来控制一组控件是否显示。这样做固然方便,但有没有考虑到对程序的影响呢?大家都知道ViewState的作用是保持控件乃致页面的状态。而把在页面上摆放很多控件会不会对程序产生影响呢?(前两天就被这个ViewState搞得很惨,回发事件执行很慢的问题.)这主要取决于一个控件(panel)的Visible属性设置为false时,控件是否还要保持状态。为此我做一个测试观察。我在一个页面中放两个panel,一个panel里面放DataGrid(DataGrid天生比较耗资源),另一个panel里面放普通的控件(这里面放两个ListBox)。

None.gif // 显示DataGrid
None.gif
private   void  ShowDataGrid(DataSet p_ds)
ExpandedBlockStart.gifContractedBlock.gif
{
InBlock.gif
//放ListBox的panel设为不可见
InBlock.gif
   pnlListBox.Visible   = false
InBlock.gif   dgrdData.DataSource  
= p_ds;
InBlock.gif   dgrdData.DataBind();   
ExpandedBlockEnd.gif}

None.gif
// 显示ListBox,不显示DataGrid
None.gif
private   void  ShowListBox()
ExpandedBlockStart.gifContractedBlock.gif
{
InBlock.gif   pnlDataGrid.Visible  
= false;
InBlock.gif   pnlListBox.Visible   
= true;
ExpandedBlockEnd.gif}
访问页面,查看源文件另存这个文件,大小如下:显示DataGird的时候文件的大小是100K(打开源文件都有点慢),而在显示Listbox的面板的时候文件大小是:42K,显然DataGrid的状态还是保持着的。虽然没有数据,这对页面还是有很大的影响的。对上面的代码进行修改如下:
None.gif // 显示DataGrid
None.gif
private   void  ShowDataGrid(DataSet p_ds)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//放ListBox的panel设为不可见
InBlock.gif
   pnlListBox.Visible   = false
InBlock.gif
//DataGrid保持状态
InBlock.gif
   lbListBox1.EnableViewState  = true
InBlock.gif
InBlock.gif   dgrdData.DataSource  
= p_ds;
InBlock.gif   dgrdData.DataBind();
ExpandedBlockEnd.gif}

None.gif
// 显示ListBox,不显示DataGrid
None.gif
private   void  ShowListBox()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   pnlDataGrid.Visible  
= false;
InBlock.gif
//DataGrid不保持状态
InBlock.gif
   pnlDataGrid.EnabledViewState = false;
InBlock.gif
InBlock.gif   pnlListBox.Visible   
= true;
ExpandedBlockEnd.gif}

经过上面的修改,在显示ListBox面板的时候,页面文件的大小是:12K 显然瘦了不少啊!(要是减肥有这么明显就好了 emsmileo.gif)。
    测试结果表明,在使用Visible动态设置一个控件是否显示的时候要关心一个ViewState的大小是否对程序有影响。在使用"胖"控件的时候要注意少使用Visible,如果非要使用尽量连同EnableViewState一起进行管理。顺便提一下,尽量少用ViewState存储对象,以减少序列反序列化带来的性能损耗,并且减轻服务器和客户端的压力,否则遇到跟我一样的问题可就麻烦了。(树控件的tag属性好像就是使用ViewState进行存储对象的)。

注:上面的代码是为了说明问题的伪代码,另根据页面和数据的不同以上数值可能有不一样.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值