0

実行時にコントロールを動的に作成する非常に動的な Web アプリがあります。

これは、私の問題を解決するためにコードの最初に必要な部分です。

これは for ループ内にあり、基本的に ID とイベント ハンドラーを使用して複数のチェックボックスを作成します。

// All I am doing here is incrementing our session counter so we can increment our ID
int id = Convert.ToInt32(Session["id"]);
id++;
Session["id"] = id;

// Now I create my checkbox
chkDynamic = new CheckBox();
chkDynamic.Text = "hey";
string chk = "chk" + id.ToString();

chkDynamic.ID = chk;
chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged);
Panel1.Controls.Add(chkDynamic);

この次のセクションは、カスタム イベント ハンドラーです。

protected void chkDynamic_CheckedChanged(object sender, EventArgs e)
    {

        if (((CheckBox)sender).Checked)
            Response.Write("you checked the checkbox :" + this.chkDynamic.ID);
        else
            Response.Write("checkbox is not checked");
    }

ODD として私を襲うもの。私が変更すれば、これは完全にうまくいくということですか:

string chk = "chk" + id.ToString();

に:

string chk = "chk";

しかし、もちろん、「同じ ID を持つ複数のコントロール」に遭遇します。

私の問題は、これを一意の ID で動作させることです! 役立つかもしれない別のODD情報。ループから取り出して、別の ID のチェックボックスを手動で追加すると、同様に機能します。これは気が遠くなるようなものです:(

    chkDynamic = new CheckBox();
    chkDynamic.Text = "hey";
   // string chk = "chk" + id.ToString();

    chkDynamic.ID = "hey1";
    chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged);
    Panel1.Controls.Add(chkDynamic);

    chkDynamic = new CheckBox();
    chkDynamic.Text = "hey";
   // string chk = "chk" + id.ToString();

    chkDynamic.ID = "hey2";
    chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged);
    Panel1.Controls.Add(chkDynamic);

プログラムもデバッグしましたが、Session["id"] に格納されている値は null でも壊れていません。常に値 0 以上を保持します。

男/ギャルを見てくれてありがとう。私は本当にこれに立ち往生しています!

PS - 申し訳ありません。エラーはありません。ID をハードコーディングしない限り、イベントは発生しません。

4

2 に答える 2

0

AutoPostBackチェックボックスのプロパティを に設定してみましたtrueか?

于 2011-11-07T15:10:32.470 に答える
0

セッション ("ID") をリセットするのを忘れている可能性があります。そのため、ページがポストバックされると、チェックボックスが新しい ID で再作成されます。チェックボックスはポストバックごとに再作成されるため、毎回同じ ID を持つ必要があり、そうでない場合は新しいコントロールとして認識され、イベント ハンドラーは呼び出されません。

于 2011-11-07T15:11:04.233 に答える