【问题标题】:Can't dynamically add Web User Controls无法动态添加 Web 用户控件
【发布时间】:2011-10-13 12:16:17
【问题描述】:

如果我想利用视图状态,我了解页面生命周期以及如何在 page_init 上添加动态控件。而且我已经阅读了很多关于这个问题的主题,但它不是很有用。

我必须使用具有一组用户控件的解决方案,这些控件继承一个接口,然后我将它们动态添加/删除到文字控件。我无法在page_init 中一次加载它们,因为稍后我必须根据用户操作删除/添加它们。这些控件包含一个按钮,只有当我在page_initpage_load 方法生成此用户控件时,才会触发其回发事件处理程序。

因此,在某些Button_Click(我更新控件列表)事件处理程序中需要处理后,我必须以某种方式重新初始化/重新启动页面的生命周期。正如我发现的那样,这是不可能的。重定向到同一页面不是解决方案,因为在这种情况下我会丢失我的整个视图状态。

所以我被卡住了,你能帮我解决一下吗?

【问题讨论】:

  • 你说的是自定义服务器控件还是网络用户控件?

标签: asp.net


【解决方案1】:

听起来您可以从创建CompositeControl 中受益。

我最近回答了一个基于动态创建文本框的类似问题,我在其中提供了一个相当详细的示例。

见:Dynamically add a new text box on button click

希望这会有所帮助。

【讨论】:

  • 你的意思是我应该创建一个复合控件,它在页面上是静态的,并且会动态填充我的 Web 用户控件?所以在我的情况下,它就像一个高级中继器或文字?或者我可以像处理用户控件那样动态地处理一组复合控件吗?
  • 将您的 CompositeControl(静态)添加到页面中,该页面将充当所有动态控件的容器,您可以根据需要使用 CreateChildControls 方法生成这些控件。
【解决方案2】:

如果我理解正确,您需要实例化动态控件以检索其视图状态,但您依赖于视图状态来确定如何实例化动态控件。

您可以使用 ASP.NET Session State?使用会话状态存储生成动态控件的信息。

当您处理按钮单击事件时,销毁并重新创建所有控件,然后将重新创建它们所需的所有信息存储在会话状态中。

下次页面实例化时,page_init 函数可以检查 Session State 中是否有任何相关信息,并使用它来重新创建控件。

【讨论】:

  • 实际上我利用了会话状态并存储了一个用于生成用户控件的类列表。但是,当用户单击其中一个用户控件中的“关闭”按钮时,我会在 page_init 之后在适当的事件处理程序中更新会话状态,因此我会看到已删除的用户控件,直到下一页回发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2012-12-10
  • 2023-03-09
相关资源
最近更新 更多