public class Search : System.Web.UI.Page
{
    public ArrayList hasChecked = new ArrayList();
    private void Page_Load(object sender, System.EventArgs e)
    {
hasChecked = ……;
……;
         ……;
    }

这样的代码,但是hasChecked的值在每次Page_Load以后都没有了,为什么?应该怎么写

解决方案 »

  1.   

    每一次的客户端回传都会创建Search对象?
    这样岂不是很郁闷
      

  2.   


    hasChecked = ……;
    ……;
             ……;
    前加
    if( !IsPostBack )return;
      

  3.   

    用VIEWSTATE保存如下:
    public class Search : System.Web.UI.Page
    {
        
       public ArrayList hasChecked 
       {
          get 
          {
             return ViewState.Item("hasChecked"); 
          }
          set 
          {
             ViewState.Item("hasChecked") = value; 
          }
       }    private void Page_Load(object sender, System.EventArgs e)
        {
    hasChecked = ……;
    ……;
             ……;
        }

    这样就可以了
      

  4.   

    if( !IsPostBack )
    {
    hasChecked = ……;
    ……;
             ……;}
      

  5.   

    没有放在if(!this.IsPostBack)中,导致每次页面加载,均重新加载ArrayList();,从而把ArrayList();的内容又清空了.
      

  6.   

    网页是无状态的。一个网页输出到客户端,服务器上就准备清除它的所有痕迹,腾出资源来给下一个请求服务。所以同样配置的服务器,能够同时给500个互联网浏览者服务,但是如果作为c/s服务器给50个终端服务就不行了。因此,在你在浏览器上看到页面的时候,一定要清醒地记得服务器上没有任何记忆。http协议也是通过客户端来保存SessionID的。asp.net通过页面上的隐藏变量来保存页面上的对象,然后在页面提交到服务器上的时候首先恢复这些对象,造成服务器好像一直保存着这些对象的假象。但是asp.net没有承诺这种机制与WinForm用法相同,你还是要学习ViewState。你的问题如果写成代码,大概应该这样:private ArrayList hasChecked{
      get{
       if(this.ViewState.Item["hasChk"]==null
         return new ArrayList();
       else
         return this.ViewState.Item["hasChk"];
      }
      set{
       this.ViewState.Item["hasChk"]=value;
      }
    }当然这要求ArrayList中的每个元素保存的对象是可序列化的,例如boolean值。如果是保存Webcontrol或者自定义对象,就要为自定义对象实现Serializable接口,或者使用LoadViewState、SaveViewState方法绕开ViewState自己实现状态读取。