我有一个从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;
}
问题是当页面回发时我的动态添加的TextBox不存在。我在调试器中检查过PlaceHolder1.Controls
,其中没有TextBoxes。 PlaceHolder1
本身在Repeater中,但我不是在PostBack上重新绑定Repeater。
我考虑使用原始HTML代替TextBox控件并从Request.Form中提取值,但这对我来说感觉很乱。如何在回发中使动态添加的TextBox持久化?
编辑:
这里有一些复杂的问题,如果没有大量的示例代码,很难显示出来。以下是重要的一些:
blah blah @A1@ blah blah @A2@ blah...
,我必须插入替换文本来代替@ A1 @,@ A2 @等。在编辑模式下,只有替换文本可以编辑。答案 0 :(得分:4)
当您动态添加控件时,它们不会在回发中保留。您必须在回发后再次将它们添加到页面。我通常在Page_Load中进行。然后,一旦添加它们,它们的回发状态将在ASP.NET页面生命周期的后期正确恢复。
所以,
希望这有帮助!
答案 1 :(得分:1)
一个可能的答案是在ITEM TEMPLATE中预先定义TEXTBOX,然后在click事件中为给定行设置'visiblity。
第二种可能性是重构转发器以使用GRIDVIEW控件。它支持开箱即用的可编辑模板。
无论如何,正在发生的事情是,由于这些控件是动态添加的,因此它们不会在下一次回发时重新创建。在回发上,如果要访问它们,则需要重新创建控件。 但,不要忘记值IS存储在表单集合中:
myval = request.form["txt" + key];