1

問題

PostBackASP ページで動的に作成されたテーブルの状態を維持する必要があります。

詳細

ユーザーがページにアクセスすると、データベースに格納されている情報に基づいて CheckBox のテーブルが作成されます。基本的に、これらの CheckBox はグリッドに配置され、データベース内の情報に基づいてチェック/チェック解除および有効/無効にされます。それらも色分けされていますが、それは実際には関係ありません.

グリッドの寸法とチェックボックスの状態は で決定されPage_Loadます。私は、CheckBoxを保持するDisplayWellだけのクラスを持っています。ページ自体にTableCell空があり、ループしてs を追加します。その後、ユーザーはチェックボックスの状態と少数の を編集し、ボタンをクリックして保存できます。TableDisplayWellTextFields

問題は、ご存じのとおり、これらの動的に作成されたオブジェクトが後に消えるという事実です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);
    }
}    
4

1 に答える 1

0

私が現れてこの質問に答えることを望んでいたAndrew-Barberのアドバイスのおかげで(あなたはまだできます!)、私は解決策を見つけました:

メソッドでオブジェクトを作成しOnInit、ブロックを削除しif(!Page.IsPostBack)ます。代わりに、ページのすべてのインスタンスに対してオブジェクトをインスタンス化します。これはページのライフサイクルの早い段階で発生し、サーバー側のメモリにオブジェクトを保持して、クライアント側で行われた変更を登録できるようにします。

于 2012-08-16T14:00:46.083 に答える