2011-08-31 133 views
0

以下是这种情况:我的页面上有一个动态创建的更新面板,因此我想我会编写一个方法来处理每个方法的所有加载。为什么__doPostBack()不会触发我的绑定加载事件?

Updatepanel创作看起来是这样的:

Dim newUpdp As New UpdatePanel 
newUpdatep.ChildrenAsTriggers = False 
newUpdatep.UpdateMode = UpdatePanelUpdateMode.Conditional 
newUpdatep.ID = Guid.NewGuid.ToString 

AddHandler newUpdatep.Load, AddressOf updatep_load_method 
updatep_Holder.ContentTemplateContainer.Controls.Add(newUpdp) 
updatep_Holder.Update() 

这就造成了更新面板和结合其负载事件方法“updatep_load_method”。只要将Updatepanel插入固定器中,就会调用此方法。方法代码如下:

Private Sub updp_load_method(sender As UpdatePanel, e As System.EventArgs) 
    Dim div As New HtmlGenericControl("div") 
    div.InnerText = Date.Time.Now.ToString 
    sender.ContentTemplateContainer.Controls.Add(div) 
    sender.Update() 
End Sub 

稍后我想更新面板,并刷新时间。所以我使用javascript __doPostBack方法。根据Dave Ward,__doPostBack方法遵循整页回发生命周期,所以我认为我的更新面板的加载事件将被触发,并且“updatep_load_method”将被该特定更新面板调用...

尽管部分回发发生,并且其他更新面板的加载事件被调用,我的绑定的不是。那么这里发生了什么?

+0

您是否在回复中再次添加更新面板? – Tejs

+0

@Tejs,我想知道这是否会发生 - 就像我可能会重新创建控件,但不会再绑定它们或类似的东西。我会明天尝试詹姆斯约翰逊的回答,看看我如何继续。 –

回答

0

您需要在Page_Init重新创建动态控件,并必须使用相同的Id(所以你不能做一个Guid.NewGuid.ToString()而重现控制)。

否则,ASP.Net将无法找到您的控件并使用ViewState中的数据填充它。

这是一个很好的article,它解释了更多关于动态控件的内容。

+0

谢谢@Mrchief,我一定会试试这个。对于检索更新面板的ID,您有任何建议,以便我可以使用相同的ID重新创建?或者你会建议不要首先使用GUIDS?我使用它们的唯一原因是为每个动态创建的面板实现独特的ID。 –

+0

你需要以某种方式跟踪ID。我建议你根据你可以使用的一些已知的属性来创建它,同时重新创建。没有进一步了解代码就很难说清楚。如果可能的话,避免使用动态控件,并尽量避免使用UpdatePanel! – Mrchief

+0

我接受了关于不使用动态面板的建议 - 我发现使用某些控件预先填充页面会更容易(因此我事先知道这些ID),然后按照您的建议在page_init期间重新绑定onload。 –

0

尝试实施RaisePostBackEvent方法在代码:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument) 
{ 
    //call the RaisePostBack event 
    base.RaisePostBackEvent(source, eventArgument); 

    //add whatever code you need to execute on postback here 
} 
相关问题