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

时间:2009-08-21 12:55:23

标签: c# asp.net initialization

我在类中定义一个数组,而不是在任何方法中,作为全局变量,在同一方法范围内:

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容器中?何时这样做?

4 个答案:

答案 0 :(得分:5)

每次进行任何回发时,即使只是处理按钮点击,您也会使用页面类的全新实例。这是ASP.Net 101.

要解决此问题,请删除if (!IsPostBack)支票。然后将所有可见属性设置为False,并立即将它们添加到页面中。当您找到需要的数量时,请为这么多控件将Visible属性设置为“true”。

  

总是两个;不多也不少。请求和回复。

答案 1 :(得分:2)

托管这些字段的页面实例将作为服务器使用,并在请求结束时被丢弃。毕竟,Web服务器往往基本上是无状态的 - 允许集群等。

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

要保持请求之间的值,您需要将它们放入会话中,然后自己获取它们 - 或者将它们发送到请求中的客户端(并将它们重新带回)。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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