从动态添加的ASP.NET用户控件中捕获事件

时间:2008-12-23 19:56:24

标签: asp.net user-controls placeholder-control

我有一个ASP.NET Web表单,我正在添加一个变量号User Controls。我有两个问题:

  1. 在第一个PageLoad事件中,用户控件被添加到表单上的PlaceHolder中(我只在“(!this.IsPostback)”时添加它们,但是当表单回发后,控件就消失了这是正常的吗?由于表单上的其他控件保持其状态,我希望这些动态添加的控件也保留在表单上。我是否必须为每次回发添加它们?

  2. 我还有一个按钮和按钮单击事件的事件处理程序,但是当我单击按钮时,永远不会调用此事件处理程序。在动态添加控件上捕获事件时,我有什么特别之处吗?

6 个答案:

答案 0 :(得分:3)

  1. 是的,您需要在每次回发中添加它们。
  2. 是的......在asp.net调度事件之前,控件需要在控件层次结构中(即尽可能在页面生命周期的早期创建动态控件)。

答案 1 :(得分:0)

  1. 要实现此目的,请在页面init而不是页面加载时添加控件。 (在回发时重新添加)
  2. 您需要知道添加的按钮的ID才能将它们绑定到事件。

答案 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;
}