为什么在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容器中?什么时候这样做?
这是因为页面是无状态的。您需要将数据保留在页面本身内,即ViewState:
public TextBox[,] tx
{
get { return ViewState["tx"] as TextBox[,]; }
set { ViewState["tx"] = tx; }
}
是的,这是一个好主意,它到目前为止工作,但现在缺少一些东西。我应该何时将文本框中的值传输到视图状态? – 2009-08-21 13:11:10
如果您在正确的时间将控件放在页面上,ASP.Net会为您担心。 – 2009-08-21 13:24:28
你可以使用一些JavaScript来检测onunload事件? – James 2009-08-21 14:44:53
每次你做任何回发,即使只是处理按钮点击,你正在使用一个全新的页面类的实例。这是ASP.Net 101.
要解决该问题,请删除if (!IsPostBack)
检查。然后将所有可见属性设置为False
并立即将它们添加到页面中。当你发现你需要多少个控件时,将Visible属性设置为“true”。
总是有两个;不多也不少。请求和响应。
您是否尝试将它们添加到页面的控件集合中,或者添加到页面上的控件集合(如隐藏面板)上?
当我知道需要的号码时,我将它们放在另一个事件的页面上。那是错的吗? – 2009-08-21 13:00:08
@Ahmad:它可以工作,但这不是一个好主意。 – 2009-08-21 13:21:06
承载字段的页面实例作为服务器存在,并在请求结束时被丢弃。 Web服务器往往在很大程度上是无状态的 - 允许集群等。
下一个请求将创建一个新的页面实例(可能在不同的机器上,如果它已经回收,可能在一个新的AppDomain
中)。
要保持请求之间的值,您需要将它们放入会话中,然后自己将它们取回 - 或者在请求中将它们发送给客户端(并将其再次取回)。
请勿将它们放入会话中。如果你这样做,你会在会话中为每个用户添加10,000个文本框控件(加上表格单元格和行_及其内容_)。 – 2009-08-21 13:22:45