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

C# 从页面中动态添加和删除用户控件,c#,asp.net,.net,C#,Asp.net,.net,我有一个Web用户控件,我需要将其添加到页面中,以便将其添加到HtmlForm,这样我就可以使用此用户控件发送电子邮件,但是,我不需要此控件显示在页面上,我只需要它填充数据,这样我就可以发送此电子邮件,然后将其删除,这样它就不会显示在页面上 目前我已尝试: myControl c = new myControl(); c.InitializeAsUserControl(Page); c.fillInfo(data); //add to email form and send email 然而

我有一个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,但不幸的是,这也不起作用。如果我只是创建一个
新的myControl()
不在页面上呈现或调用
LoadControl
我在尝试修改用户控件中的
asp:labels
时调用
fillInfo
时会引发异常,表示对象为空或未实例化。

在页面周期的哪一部分加载和卸载控件?要正常工作,需要在
Page\u Init
中完成。在
页面加载中执行此操作是一个常见错误。如果将其添加到
页面_Init
以外的任何其他位置,它将无法正确添加到
视图状态
,并且会出现问题

而不是卸载-我会将其添加到面板并将可见性设置为false。目前不适用于您的原因可能是控件添加到页面周期的错误部分,并且没有正确添加到
ViewState


这可能是你的问题吗?

我建议阅读整个系列。要成功地将动态控件与回发、viewstate、绑定和其他WebForms功能结合使用,您必须彻底了解页面和控件的生命周期及其交互

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


我已经使动态控件正常工作,但99%的情况下,除非控件非常琐碎,否则要找到不同的解决方案要比确保所有交互都能正确使用动态控件创建更容易。

所有这些都发生在表单提交上,因此这是一个单独的事件。正如您在问题中所看到的,我试图将其添加到面板中,设置为set Visible=false,但这似乎也不起作用…@avivas。不幸的是,这已经太晚了。Page_Init已通过-动态控件无法工作。老实说,我尽量避免他们,因为他们很难相处。是否不可能在页面上隐藏ghe控件?是否需要加载?在第一个示例中,不清楚控件是如何附加到页面的,实例化控件不会显式地将其添加到页面。@MyItchyChin我更新了我的第一个示例以使其更清晰。啊,这就是它绑定的地方。usercontrol是否需要页面外的任何内容?如果没有,您可以实例化一个页面的实例并将其传递。@MyItchyChin我试图实例化另一个页面,但没有例外,电子邮件没有我的用户控制。谢谢您的输入,我将查看该系列文章,但届时我很可能会尝试找到不同的解决方案