使用checkedChanged EventHandler将PostBackTrigger和AsyncPostBackTriggers添加到UpdatePanel以获取动态生成的复选框

时间:2013-02-07 02:14:21

标签: c# asp.net

有关更详细的解释,请参阅.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的checkebox:

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的{​​{1}}中添加动态创建的Controls的{​​{1}}?

1 个答案:

答案 0 :(得分:6)

无法向标记添加动态(或编程创建的)控件,因此,您必须在创建控件后使用ScriptManager注册该控件。

根据AsyncPostBackTrigger documentation,不支持以编程方式添加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);

重要提示:在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"));