我有一个ASP.NET Web表单,我正在添加一个变量号User Controls。我有两个问题:
在第一个PageLoad事件中,用户控件被添加到表单上的PlaceHolder中(我只在“(!this.IsPostback)”时添加它们,但是当表单回发后,控件就消失了这是正常的吗?由于表单上的其他控件保持其状态,我希望这些动态添加的控件也保留在表单上。我是否必须为每次回发添加它们?
我还有一个按钮和按钮单击事件的事件处理程序,但是当我单击按钮时,永远不会调用此事件处理程序。在动态添加控件上捕获事件时,我有什么特别之处吗?
答案 0 :(得分:3)
答案 1 :(得分:0)
答案 2 :(得分:0)
1)您应该在Pre-init(Page life cycle)
上添加控件2)您必须将事件处理程序附加到已创建按钮的事件。(事件可能在页面生命周期的后期发生,而不是以声明方式创建的控件的相同事件)
答案 3 :(得分:0)
我遇到了类似的问题。我有一个页面显示了一组自定义Web控件。我的解决方案是添加一个额外的隐形Web控件,以便当我单击一个按钮添加另一个控件时,我将使用不可见的控件。然后在回发后我的加载功能将添加另一个不可见的控件到集合。
答案 4 :(得分:0)
我昨天想通过在loadviewstateevent被触发后立即加载控制树,你可以让你的应用程序正常工作。如果你覆盖loadviewstate事件,调用mybase.loadviewstate,然后把你自己的代码重新生成后面的控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用viewstate字段来保存可用于重新创建这些控件的ID或数组信息。
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
MyBase.LoadViewState(savedState)
If IsPostBack Then
CreateMyControls()
End If
End Sub
答案 5 :(得分:0)
我遇到了完全相同的问题,并在5-6小时内挣扎。 我发布这个也许像我这样的人可以得到帮助。
1)您应该在Page.PreInit事件中初始化控件。 (在我的情况下,我必须将我的控件添加到占位符,所以我扩展了PreInit以加载这些控件,但你不需要这样做。这取决于你的场景。)
2)在Page.PreInit事件中初始化控件后,应该将这些确切的方法绑定到控件上。
以下是我的示例代码:
protected override void OnPreInit(EventArgs e)
{
// Loading controls...
this.PrepareChildControlsDuringPreInit();
// Getting ddl container from session and creating them...
if (GetDDLSession().Count != 0)
{
foreach (DropDownList ddl in GetDDLSession())
{
ddl.SelectedIndexChanged += SelectedIndexChanged;
phDropDowns.Controls.Add(ddl);
}
}
base.OnPreInit(e);
}
public static void PrepareChildControlsDuringPreInit(this Page page)
{
// Walk up the master page chain and tickle the getter on each one
MasterPage master = page.Master;
while (master != null) master = master.Master;
}