4

我有一个 ASP.NET Web 表单,我正在向其中添加一个可变编号的用户控件。我有两个问题:

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

  2. 我还有一个按钮和一个按钮单击事件的事件处理程序,但是当我单击按钮时,这个事件处理程序永远不会被调用。为了捕捉动态添加的控件上的事件,我需要做些什么特别的事情吗?

4

6 回答 6

3
  1. 是的,您需要在每个回发中添加它们。
  2. 是的...在asp.net 调度事件之前,控件需要在控件层次结构中(即尽可能早地在页面生命周期中创建动态控件)。
于 2008-12-23T20:00:05.013 回答
0
  1. 为此,请在页面初始化而不是页面加载时添加控件。(在回发时重新添加)
  2. 您需要知道添加的按钮的 ID 以将它们绑定到事件。
于 2008-12-23T19:59:11.473 回答
0

1)您应该在Pre-init(页面生命周期)上添加控件

2)您必须将事件处理程序附加到创建按钮的事件。(事件可能在页面生命周期中比以声明方式创建的控件的相同事件发生得晚得多)

于 2008-12-23T20:00:56.230 回答
0

我遇到了类似的问题。我有一个显示自定义 Web 控件集合的页面。我的解决方案是添加一个额外的不可见 Web 控件,这样当我单击一个按钮以添加另一个控件时,我将只使用不可见的控件。然后在回发时,我的加载功能会向集合中添加另一个不可见的控件。

于 2009-03-31T20:35:35.813 回答
0

我昨天发现,您实际上可以通过在 loadviewstateevent 触发后立即加载控件树来使您的应用程序正常工作。如果您覆盖 loadviewstate 事件,调用 mybase.loadviewstate,然后在其后放置您自己的代码以重新生成控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用视图状态字段来保存可用于重新创建这些控件的 ID 或数组信息。

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
于 2009-07-16T13:19:59.007 回答
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;
}
于 2013-09-20T12:50:19.347 回答