1

さて、私が取り組んでいるプロジェクトでは、ページ上にハードコードされたasp:panelを作成し、それを次のように入力しています。

  1. ドロップダウンリスト
  2. asp:Table、a​​sp:TableHeaderRow
  3. 追加およびキャンセルボタン

selectedIndexChangedイベントがDropDownListで発生すると、テーブル行が作成され、6つほどのテーブルセルで埋められ、その中にasp:Textboxesが配置されます。

最終的に、それらはすべてテーブル行に追加され、テーブル行コレクションに追加されます。

それはすべて問題なく機能しますTableRowsが、foreachループで動的に作成されたこれらの情報を追加しようとすると、それらはどこにも見つかりませんが、TableHeaderRowはあります。

また、[追加]をクリックしてプロセスを実行すると、null例外は発生せず、ヘッダーの後に残るのはヘッダーだけで、すべての行が表示されなくなります。

とにかく、私は本当に馬鹿げた何かが欠けていると感じています。私は多くのフォーラム、投稿、MSDNを調べましたが、私の問題に対する答えは見つかりませんでした。どんな助けでも大歓迎です!

4

1 に答える 1

2

Page_Initではなく、テーブルに動的行を追加する必要がありますPage_Load。新しい行で作成している場合Page_Load、ViewStateに追加されず、この問題が発生します。

残念ながら、トリッキーになる可能性のあるサーバー側のイベントに応じてそれらを追加しています。まだ行を追加する必要がありますPage_Initが、ページが投稿されたときにPage_InitselectedIndexChangedイベントはまだ発生していません。ページのライフサイクルは時期尚早です。

私が見つけた唯一の方法でそれが発火したかどうかを知りたい場合は、その時点でコレクションをPage_Init調べることです。Request.Form("__EVENTTARGET")これには、ポストバックをトリガーしたコントロールのコントロールIDが含まれます。この場合、これはドロップダウンリストになります。イベントを発生させたコントロールはそこにありますが、IDは修飾されます。つまり、MyControIDではなくctl_MasterPageContentHolderID_NamingContainer1_MyControlID`などです。したがって、イベントを探すときに考慮する必要があります。そのイベントが発生したことを確認したら、行を追加できます。それらがそこに追加されると、それらは消えません。

私が言うように、仕事をするのは難しいですが、私は過去にこれをうまくやりました。一般に、動的制御は、この理由だけで操作するのが非常に難しい場合があります。代替案を検討することをお勧めします。とにかくそれで頑張ってください。

于 2012-01-11T19:02:46.890 に答える