为了更清楚地解释这里我的代码.asp存档:
<asp:UpdatePanel ID="updPnlTabs" runat="server" >
<Triggers>
<asp:PostBackTrigger ControlID="btnSave" />
</Triggers>
<ContentTemplate>
<asp:Panel ID="pnlCheckList" runat="server" style="margin-bottom: 10px;" CssClass="listingDummyTab">
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
在我的.cs代码中,我动态创建了checkebox到pnlCheckList,如下所示:
CheckBox chkModuleID = new CheckBox();
chkModuleID.ID = drNew[def.ID].ToString();
chkModuleID.AutoPostBack = true;
chkModuleID.CheckedChanged += new EventHandler(chkID_OnRow_Check);
pnlCheckList.Controls.Add(chkModuleID);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是当我更改复选框时,整个页面必须加载而不是内容UpdatePanel.请注意,动态创建的复选框的EventHandler正在触发,但不在UpdatePanel内.
我怎么可以添加ID"的动态创建小号Controls中<Triggers>的UpdatePanel?
无法向标记添加动态(或编程创建)控件,因此,必须ScriptManager在创建控件后注册该控件.
根据AsyncPostBackTrigger 文档,AsyncPostBackTrigger不支持以编程方式添加控件:
要以编程方式注册回发控件,请使用控件的
RegisterAsyncPostBackControl方法ScriptManager.然后UpdatePanel在控件回发时调用控件的Update方法.
基本上你应该做的是在创建CheckBox控件之后注册它.
// original code
CheckBox chkModuleID = new CheckBox();
chkModuleID.ID = drNew[def.ID].ToString();
chkModuleID.AutoPostBack = true;
chkModuleID.CheckedChanged += new EventHandler(chkID_OnRow_Check);
pnlCheckList.Controls.Add(chkModuleID);
// register the control to cause asynchronous postbacks
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(chkModuleID);
Run Code Online (Sandbox Code Playgroud)
重要提示:在chkID_OnRow_Check回调/事件处理程序功能中,请确保您致电UpdatePanel1.Update().
更新2013-02-20
由于我对您收到的异常的理解,请考虑使CheckBox ID唯一.
// One possibility is this - assuming you don't require a consistent ID
chkModuleID.ID = String.Format("{0}-{1}", drNew[def.ID].ToString(), Guid.NewGuid().ToString("N"));
Run Code Online (Sandbox Code Playgroud)