我在类中定义一个数组,而不是在任何方法中,作为全局变量,在同一方法范围内:
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 :(得分: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集合(如隐藏面板)?