問題
PostBack
ASP ページで動的に作成されたテーブルの状態を維持する必要があります。
詳細
ユーザーがページにアクセスすると、データベースに格納されている情報に基づいて CheckBox のテーブルが作成されます。基本的に、これらの CheckBox はグリッドに配置され、データベース内の情報に基づいてチェック/チェック解除および有効/無効にされます。それらも色分けされていますが、それは実際には関係ありません.
グリッドの寸法とチェックボックスの状態は で決定されPage_Load
ます。私は、CheckBoxを保持するDisplayWell
だけのクラスを持っています。ページ自体にTableCell
空があり、ループしてs を追加します。その後、ユーザーはチェックボックスの状態と少数の を編集し、ボタンをクリックして保存できます。Table
DisplayWell
TextFields
問題は、ご存じのとおり、これらの動的に作成されたオブジェクトが後に消えるという事実ですPage_Load
。サーバーはそれらをクライアントに渡し、それらは破棄されます。データベースを更新できるようにするには、テーブルまたはオブジェクト配列の状態を保持できる必要があります。
これまで、隠しフィールドを使用して、ポストバック間で永続化するために必要な情報を保存していましたが、1 つまたは 2 つの変数に対してのみでした。任意の数)。オブジェクトをセッション変数に保存できると読みましたが、オブジェクトの状態はクライアント側で行われた変更を登録しますか? ダメだという話も聞いたことがあります。
編集:テストした後、変更は登録されていません-セッション変数から同じ配列を取得しました。
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);
}
}