4

为了更清楚的解释,这里是我存档的代码.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>

在我的.cs代码中,我动态地为 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);

现在我的问题是当我更改复选框时,整个页面必须加载而不是UpdatePanel. 请注意,动态创建的复选框的 EventHandler 正在触发,但不在 UpdatePanel 内。

如何添加动态ID创建Controls<Triggers>UpdatePanel

4

1 回答 1

8

无法将动态(或以编程方式创建的)控件添加到标记中,因此,您必须ScriptManager在创建控件后将其注册。

根据AsyncPostBackTrigger 文档AsyncPostBackTrigger,不支持以编程方式添加控件:

要以编程方式注册回发控件,请使用控件的RegisterAsyncPostBackControl方法ScriptManagerUpdatePanel然后在控件回发时调用控件的 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);

重要提示: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"));
于 2013-02-20T04:30:48.793 回答