情况就是这样:我的页面上有一个可变数量的动态创建的更新面板,所以我想我会编写一个方法来处理每个面板的所有加载。
我的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()
这将创建更新面板并将其load事件绑定到方法“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方法。根据{{3}},__ doPostBack方法遵循整页回发生命周期,因此我认为我的Update面板的load事件将被触发,并且该特定更新面板将调用“updatep_load_method”...
虽然发生了部分回发,并且调用了其他更新面板的加载事件,但我的绑定事件却没有。那么这里发生了什么?
答案 0 :(得分: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
}
答案 1 :(得分:0)
您需要在Page_Init
期间重新创建动态控件,并且必须使用相同的Id
(因此在重新创建控件时无法执行Guid.NewGuid.ToString()
)。
否则,ASP.Net将无法找到您的控件并使用ViewState
中的数据填充它。
这是一个很好的article,它解释了有关动态控件的更多信息。