我需要通过ASP页面上的PostBack
维护动态创建的表的状态。
当用户访问页面时,将根据存储在数据库中的信息创建CheckBoxes表。基本上,这些CheckBox被布置在网格中,根据数据库中的信息进行检查/取消选中和启用/禁用。它们也是彩色编码的,但这并不是真正相关的。
网格的尺寸和复选框的状态由Page_Load
确定。我有一个名为DisplayWell
的类,它只是一个TableCell
来保存CheckBox。页面本身有一个空的Table
,我循环并添加DisplayWell
。然后,用户可以对复选框的状态和少数TextFields
进行编辑,然后单击按钮进行保存。
我确定你知道的问题是,这些动态创建的对象在Page_Load
之后消失了:服务器将它们移交给客户端并且它们被销毁了。我需要能够保留表或对象数组的状态才能更新数据库。
到目前为止,我已经使用隐藏字段来存储我需要在回发中保留的信息,但仅限于一个或两个变量,在这种情况下实际上不起作用(通常我们谈论的是96个CheckBox,但它可以是任何数字)。我已经读过你可以在会话变量中存储对象,但是对象的状态是否会在客户端进行更改?我也听说过这个坏主意。
编辑: 在测试之后,没有注册更改 - 我从会话变量中获得了相同的数组。
FWIW,这里是Page_Load
:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Request.QueryString["Plate_INDEX"] != null &&
Request.QueryString["Block_INDEX"] != null)
{
String sPIndex = Request.QueryString["Plate_INDEX"].ToString();
String sBIndex = Request.QueryString["Block_INDEX"].ToString();
if(-1 != Block_INDEX)
{
lblExpPlate.Text = "Edit a Solution";
populateFields();
}
hfPlate_INDEX.Value = Plate_INDEX.ToString();
hfBlock_INDEX.Value = Block_INDEX.ToString();
createPlate();
addToTable();
} // end queryString != null
}
} // end Page_Load
private void createPlate()
{
MTT_Plate_IO mpio = new MTT_Plate_IO();
SqlDataReader plateReader = mpio.Get_Plate(Plate_INDEX);
if (plateReader.Read())
{
r = (int)plateReader["Plate_Rows"];
c = (int)plateReader["Plate_Columns"];
hfPlate_INDEX.Value = plateReader["Plate_INDEX"].ToString();
dwArr = new DisplayWell[r, c];
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
dwArr[i, j] = new DisplayWell();
dwArr[i, j].cb.Checked = false;
dwArr[i, j].cb.Enabled = true;
}
} // end creation of plate
} // end plateReader
} //end createPlate();
private void addToTable()
{
// create a header for the table
TableRow header = new TableRow();
TableHeaderCell blankCell = new TableHeaderCell();
header.Cells.Add(blankCell); //blank cell to align with data
// add numbers to top of plate
for (int i = 1; i <= c; i++)
{
TableHeaderCell thc = new TableHeaderCell();
thc.Text = i.ToString();
header.Cells.Add(thc);
}
tblPlate.Rows.Add(header);
//create the plate
for (int i = 0; i < r; i++)
{
TableRow tr = new TableRow();
TableCell rowHeader = new TableCell();
rowHeader.CssClass = "style5";
//add a letter to the beginning of the row
String rowHeaderText = ((char)(i + 65)).ToString();
rowHeader.Text = rowHeaderText;
tr.Cells.Add(rowHeader);
for (int j = 0; j < c; j++)
{
tr.Cells.Add(dwArr[i, j].tc);
}
tblPlate.Rows.Add(tr);
}
}
答案 0 :(得分:0)
感谢Andrew-Barber的建议,我曾希望他出现并回答这个问题(你还可以!),我想出了解决方案:
在OnInit
方法中创建对象并删除if(!Page.IsPostBack)
块,而不是为页面的每个实例实例化对象。这在页面生命周期的早期发生,并在服务器端将对象保留在内存中,允许更改客户端进行更改。