1

イベントを発生させる動的コントロールを含む動的テーブルを作成するページがあります。それは機能しますが、テーブルの変更を出力するために、いくつかのイベントで(page_loadの後)そのテーブルを再生成したくありません。

私は問題を理解しています。現時点では、コントロールは page_load の後に作成され、イベントが発生しないため、viewstate に保持されません。しかし、どうすればこれを行うことができますか?

これが私のコードです:

protected void Page_Load(object sender, EventArgs e)
{
    generateTable(); // When pass just here, it works well
}

private void generateTable()
{
    Table tbl = new Table();
    // Here I create my table with controls

    tableContainer.Controls.Clear(); // tableContainer is a Panel fixed in aspx page
    tableContainer.Controls.Add(tbl);
}

protected void txt_TextChanged(object sender, EventArgs e)
{
    // Do some stuff to change values in the table
    generateTable(); // Re-generate (but events will not be raised)
}

更新 1:

私は何か(開発を複雑にする)について考えましたが、すべての行とコントロールを作成し、page_load ごとに呼び出す generateTable を実行する必要があります。一方、コントロールにデータを入力する別のメソッドを作成しますか? だから、イベントでは、私は 2 番目のものを呼び出します。

しかし、私のテーブルは動的に生成され、イベントの後にコントロールを追加することもできます(テーブルに新しい行とコントロールを作成するドロップダウンリストがあるので、最初に行が表示されないため、ここでも立ち往生していますポストバック ?)

4

2 に答える 2

0

代わりに、PageInit イベントでコントロールを生成する必要があります。PageInit で生成されたコントロールは、asp.net フレームワークによって自動的に管理されます (viewstate の永続性、発生したイベントなどを取得できます)。

補足: PageInit では、動的コントロールを常に再生成する必要があります。そうしないと、フレームワークがそれらを管理できなくなります。

PageInit でコントロールを生成し、ポストバック イベントでそれらのプロパティを次のように変更してみてください。

List<LiteralControl> list = new List<LiteralControl>();

protected void Page_Init(object sender, EventArgs e)
{
    generateTable(); // When pass just here, it works well
}

private void generateTable()
{
    Table tbl = new Table();
    // Here I create my table with controls

    int rows = 3;
    int cols = 2;
    for (int j = 0; j < rows; j++)
    {
        TableRow r = new TableRow();
        for (int i = 0; i < cols; i++)
        {
            TableCell c = new TableCell();
            LiteralControl l = new LiteralControl("row " + j.ToString() + ", cell " + i.ToString());

            // save a reference to the control for editing
            list.Add(l);

            c.Controls.Add(l);
            r.Cells.Add(c);
        }
        tbl.Rows.Add(r);
    }

    tableContainer.Controls.Clear(); // tableContainer is a Panel fixed in aspx page
    tableContainer.Controls.Add(tbl);
}

protected void txt_TextChanged(object sender, EventArgs e)
{
    // edit controls here
    foreach (LiteralControl ctrl in list)
    {
        ctrl.Text = "TextChanged";
    }
}
于 2013-06-04T10:25:25.383 に答える