为什么在Page_Init中初始化后变量为空?

为什么在Page_Init中初始化后变量为空?

问题描述:

我在类定义一个数组,而不是在任何方法中,作为一个全局变量,在方法相同的范围:为什么在Page_Init中初始化后变量为空?

TextBox[,] tx = new TextBox[100,100]; 
TableCell[,] tc = new TableCell[100, 100]; 
TableRow[] tr = new TableRow[100]; 

我初始化它们在Page_Init事件:

protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //only for initiializing 
      for (int i = 0; i < 100; i++) 
      { 
       tr[i] = new TableRow(); 
       for (int j = 0; j < 100; j++) 
       { 
        tx[i, j] = new TextBox(); 
        tc[i, j] = new TableCell(); 
       } 
      } 

     } 

    } 

当我点击一个按钮或任何回发事件时,变量再次变为空!那有什么不对?

============================================== ===========================

这是通过使用Session来存储它们,但现在缺少一些东西。如何将文本框中的值保存到此Session容器中?什么时候这样做?

+0

请勿将它们放入会话中。如果你这样做,你会在会话中为每个用户添加10,000个文本框控件(加上表格单元格和行_及其内容_)。 – 2009-08-21 13:22:45

这是因为页面是无状态的。您需要将数据保留在页面本身内,即ViewState:

public TextBox[,] tx 
{ 
    get { return ViewState["tx"] as TextBox[,]; } 
    set { ViewState["tx"] = tx; } 
} 
+0

是的,这是一个好主意,它到目前为止工作,但现在缺少一些东西。我应该何时将文本框中的值传输到视图状态? – 2009-08-21 13:11:10

+0

如果您在正确的时间将控件放在页面上,ASP.Net会为您担心。 – 2009-08-21 13:24:28

+0

你可以使用一些JavaScript来检测onunload事件? – James 2009-08-21 14:44:53

每次你做任何回发,即使只是处理按钮点击,你正在使用一个全新的页面类的实例。这是ASP.Net 101.

要解决该问题,请删除if (!IsPostBack)检查。然后将所有可见属性设置为False并立即将它们添加到页面中。当你发现你需要多少个控件时,将Visible属性设置为“true”。

总是有两个;不多也不少。请求和响应。

您是否尝试将它们添加到页面的控件集合中,或者添加到页面上的控件集合(如隐藏面板)上?

+0

当我知道需要的号码时,我将它们放在另一个事件的页面上。那是错的吗? – 2009-08-21 13:00:08

+0

@Ahmad:它可以工作,但这不是一个好主意。 – 2009-08-21 13:21:06

承载字段的页面实例作为服务器存在,并在请求结束时被丢弃。 Web服务器往往在很大程度上是无状态的 - 允许集群等。

下一个请求将创建一个新的页面实例(可能在不同的机器上,如果它已经回收,可能在一个新的AppDomain中)。

要保持请求之间的值,您需要将它们放入会话中,然后自己将它们取回 - 或者在请求中将它们发送给客户端(并将其再次取回)。