2013-01-08 70 views
3

我有一个用户控件只包含一个文本框,而在另一个表单上我动态添加了这个用户控件,用户可以多次添加用户控件。我使用会话变量重新创建用户控件(也许这种方法听起来不错)。重新创建控件后,文本框的值显然消失。有没有解决方案可以在回发时保持用户控件的状态?保持回发时动态添加用户控件的状态?

+0

[可能重复数据删除(http://stackoverflow.com/questions/113392/dynamically-added-controls-in -asp-net) –

+0

视图状态是首选方法。 –

回答

3

我以前也遇到同样的问题。

我所做的是给动态添加的控件ID,并确保它在回发时也保留该ID(在我的情况下,我保留了会话中的所有信息并重新创建了控件) 。

一旦回发后的控件具有与以前相同的ID,Microsoft就做了魔术并用预回发值重新填充了控件。

+0

我知道这是一个旧的职位。但是,如果你能以一个例子来帮助我,那将会很好。我在这里有几乎类似的问题。 http://stackoverflow.com/questions/40058699/how-to-re-use-already-bound-data-in-a-user-control-on-post-back 我能够将它存储在会话中,但我无法将它绑定。 – thebenman

0

使用对象缓存。将usercontrol添加到缓存中,并在需要时将其检索出来。

你可以看到这是如何工作的一个很好的例子:ASP.net-Tutorials Cache and Object Cache.

我也学习asp.net现在,发现相当不错的解释。我还使用了Microsoft Library

+7

不要这样做:-)不应该将缓存用作主存储,只用于您可以在需要时放回的内容。如果ASP.NET进程因某种原因决定进行回收,而会话和视图状态将继续存在,则缓存可以消失。 –

+0

我明白了,谢谢你的提示,一定会记得这一点。 – William

7

如果正确Page Life Cycle事件(PreInit),他们将通过IPostBackDataHandler接口保持自己的状态过程中添加动态控件回控制。

PreInit - 创建或重新创建动态控件。

+0

这似乎是个好建议;然而,在这个阶段所有的控件仍然是“空”的。那么,如何将一个动态控件添加到一个空的'Placeholder'控件? –

0

继承的IPostBackDataHandler接口具有的LoadPostData方法处理该回发数据每个服务器控制。当一个类(页面,表单,占位符,控件等)实现控制时,该类将调用方法并传递发布的数据和密钥以保持控制状态

所有你需要做的是在页面加载事件之前或之内重新实例化/重新初始化动态控件,每次在回发期间并将此控件添加到页面/窗体/占位符。然后通过父控件调用LoadPostData方法将发布的数据自动分配给控件。

检查这篇文章以了解如何编写代码,动态控制 - How to maintain dynamic control events, data during postback in asp.net

+0

请修正你的语法;你没有大写字母,也没有标点符号,而且句法可怕。如果没有人能理解,你的答案是无用的。 – ragingasiancoder