从页面动态添加和删除用户控件

时间:2012-02-03 14:11:34

标签: c# asp.net .net

我有一个Web用户控件,我需要添加到页面只是为了将其添加到HtmlForm所以我可以使用此用户控件发送电子邮件,但是,我不需要此控件来出现在页面上,我只需要它来填充数据,这样我就可以发送这封电子邮件,然后将其删除,这样就不会出现在页面上。

目前我尝试过:

myControl c = new myControl();
c.InitializeAsUserControl(Page);
c.fillInfo(data);

//add to email form and send email

然而,一旦发送电子邮件和确认消息

,这会将控件添加到回发的当前页面

我也试过

myControl c = (myControl)Page.LoadControl("~/filename.ascx");
//send email
Page.Controls.Remove(c);

但这也会在页面上呈现控件而不会将其删除。我试图将它添加到面板并将Visible设置为false,但不幸的是,这也不起作用。如果我只创建一个new myControl()而不在页面上呈现或调用LoadControl,当我尝试修改用户控件中的fillInfo时,调用asp:labels时会抛出异常对象为null或未实例化。

2 个答案:

答案 0 :(得分:1)

您在加载和卸载控件的页面循环的哪个部分?要正常工作,需要在Page_Init中完成。在Page_Load中执行此操作是一个常见的错误。如果将其添加到Page_Init以外的任何其他位置,则不会将其正确添加到ViewState,然后会出现问题。

而不是卸载 - 我会将它添加到Panel并将Visibility设置为false。可能是目前不适合您的原因是控件是在页面循环的错误部分添加的,并且未正确添加到ViewState

这可能是你的问题吗?

答案 1 :(得分:1)

我建议阅读整个TRULY UNDERSTANDING DYNAMIC CONTROLS系列。要成功使用带有回发,视图状态,绑定和其他WebForms 功能的动态控件,您必须了解页面并控制生命周期及其内部的交互。

当你加载并设置ViewState时,取决于循环。 ViewState在Page_Init和Page_Load之间加载,因此控件必须位于Page_Init中。但是,任何基于自动加载的ViewState的处理都需要进入Page_Load。根据控件层次结构启用ViewState的位置/时间也会影响这一点。如果你真的希望它能够发挥作用,我建议你深入阅读上面的指南。或者,您必须在页面中发布您的整个控制代码及其用途,以便我们告诉您哪些部分缺少或者页面生命周期的错误部分。

我已经使动态控件工作了,但99%的时候,除非控件非常简单,否则找到一个不同的解决方案比确保所有交互在动态控件创建中正常工作更容易。