动态地将TextBoxes插入到Repeater中并检索它们的值
本文关键字:检索 Repeater TextBoxes 插入 动态 | 更新日期: 2023-09-27 17:50:17
我有一个从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;
}
问题是,我的动态添加的文本框不存在,当页面发回。我在调试器中检查了PlaceHolder1.Controls
,其中没有文本框。PlaceHolder1
本身在中继器中,但我没有在PostBack上重新绑定中继器。
我考虑过使用原始HTML来代替TextBox控件,并从Request中提取值。形式,但这对我来说有点寒酸。我如何使动态添加的文本框在回发中持久?
编辑:
这里有一些复杂的地方,如果没有大量的示例代码,很难展示出来。以下是主要的:
- 中继器中的每个单元格可以有只读和可编辑文本的混合(即动态插入的标签和文本框)
- 我不知道每个单元格中有多少可编辑区域。原始文本可能看起来像
blah blah @A1@ blah blah @A2@ blah...
,我必须插入替换文本来代替@A1@, @A2@等。在编辑模式下,只有替换文本是可编辑的。
动态添加控件时,它们不会跨回发保存。您必须在回发后再次将它们添加到页面中。我通常在Page_Load中做。然后,一旦添加了它们,它们的回发状态将在稍后的ASP中正确恢复。. NET页生命周期。
- 每次加载页面时必须添加动态控件,
- 但是一旦你添加了它们,ASP。
希望这对你有帮助!
一个可能的答案是在ITEM TEMPLATE中预先定义TEXTBOX,然后在click事件中为给定行设置它的可见性。
第二种可能是重构中继器以使用GRIDVIEW控件。它支持开箱即用的可编辑模板。
无论如何,发生的事情是,因为这些控件是动态添加的,它们不会在下一次回发时重新创建。在回发时,如果希望访问控件,则需要重新创建控件。但是,不要忘记值存储在表单集合中:
myval = request.form["txt" + key];