編集可能な要素と読み取り専用の要素が混在する、SQL からバインドされた Repeater があります。行の「編集」ボタンをクリックすると、編集可能な部分がテキストボックスに変換され、「更新」をクリックすると変更が保存されます。
以下は、[編集] ボタンと [更新] ボタンの OnClick コードの (非常に) 簡略化されたバージョンです。
switch(commandName)
{
case "Edit":
Label1.Visible = false; //hide read-only version
PlaceHolder1.Visible = true; //show editing version
//Dict1 is Dictionary<string, string> in this example.
foreach (var key in Dict1)
{
//insert a TextBox dynamically into the PlaceHolder
PlaceHolder1.Controls.Add(new TextBox
{
ID = "txt" + key,
Text = Dict1[key]
});
}
break;
case "Update":
//retrieve user input from dynamically-added TextBoxes
foreach (var TextBox1 in PlaceHolder1.Controls.Where(c => c.ID.StartsWith("txt")))
{
doStuff(TextBox1);
}
Label1.Visible = true; //show read-only version
PlaceHolder1.Visible = false; //hide editing version
break;
}
問題は、動的に追加された TextBoxes が、ページがポストバックされたときにそこにないことです。デバッガーで調べPlaceHolder1.Controls
ましたが、TextBoxes はありません。PlaceHolder1
それ自体は Repeater の中にありますが、PostBack で Repeater を再バインドしていません。
TextBox コントロールの代わりに未加工の HTML を使用し、値を Request.Form から引き出すことを検討しましたが、それはハックのように感じます。動的に追加された TextBoxes をポストバック間で永続化するにはどうすればよいですか?
編集:
ここには、大量のサンプル コードがないと示すのが難しい複雑な問題がいくつかあります。ここに大きなものがあります:
- リピーターの各セルには、読み取り専用テキストと編集可能テキストを混在させることができます (つまり、動的に挿入されるラベルとテキスト ボックス)。
- 各セルに編集可能な領域がいくつあるかわかりません。元のテキストは のよう
blah blah @A1@ blah blah @A2@ blah...
になり、@A1@、@A2@ などの代わりに置換テキストを挿入する必要があります。編集モードでは、その置換テキストのみが編集可能です。