【发布时间】:2012-10-17 13:58:00
【问题描述】:
我有一个从 SQL 绑定的中继器,其中包含可编辑和只读元素的混合。当您单击一行上的“编辑”按钮时,可编辑部分应转换为文本框,当您单击“更新”时,它应保存您的更改。
这是编辑和更新按钮的 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;
}
问题是当页面回发时我的动态添加的文本框不存在。我在调试器中检查了PlaceHolder1.Controls,其中没有文本框。 PlaceHolder1 本身在中继器内,但我不会在 PostBack 上重新绑定中继器。
我考虑过使用原始 HTML 来代替 TextBox 控件并将值从 Request.Form 中提取出来,但这对我来说感觉很生硬。如何使动态添加的文本框在回发中持久化?
编辑:
这里有一些复杂性,如果没有大量示例代码很难说明。以下是大的:
- 中继器中的每个单元格都可以混合使用只读和可编辑文本(即动态插入的标签和文本框)
- 我不知道每个单元格中有多少可编辑区域。原始文本可能看起来像
blah blah @A1@ blah blah @A2@ blah...,我必须插入替换文本来代替 @A1@、@A2@ 等。在编辑模式下,只有替换文本是可编辑的。
【问题讨论】:
-
顺便说一下,这是非常简化的示例代码。我实际上并没有给我的控件命名,比如
Label1。
标签: c# asp.net viewstate repeater dynamic-controls