2009-08-21 94 views
0

我在類定義一個數組,而不是在任何方法中,作爲一個全局變量,在方法相同的範圍:爲什麼在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

回答

2

這是因爲頁面是無狀態的。您需要將數據保留在頁面本身內,即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

5

每次你做任何回發,即使只是處理按鈕點擊,你正在使用一個全新的頁面類的實例。這是ASP.Net 101.

要解決該問題,請刪除if (!IsPostBack)檢查。然後將所有可見屬性設置爲False並立即將它們添加到頁面中。當你發現你需要多少個控件時,將Visible屬性設置爲「true」。

總是有兩個;不多也不少。請求和響應。

0

您是否嘗試將它們添加到頁面的控件集合中,或者添加到頁面上的控件集合(如隱藏面板)上?

+0

當我知道需要的號碼時,我將它們放在另一個事件的頁面上。那是錯的嗎? – 2009-08-21 13:00:08

+0

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

2

承載字段的頁面實例作爲服務器存在,並在請求結束時被丟棄。 Web服務器往往在很大程度上是無狀態的 - 允許集羣等。

下一個請求將創建一個新的頁面實例(可能在不同的機器上,如果它已經回收,可能在一個新的AppDomain中)。

要保持請求之間的值,您需要將它們放入會話中,然後自己將它們取回 - 或者在請求中將它們發送給客戶端(並將其再次取回)。

相關問題