C# 为使用checkedChanged EventHandler动态生成的复选框向UpdatePanel添加PostBackTrigger和AsyncPostBackTriggers

C# 为使用checkedChanged EventHandler动态生成的复选框向UpdatePanel添加PostBackTrigger和AsyncPostBackTriggers,c#,asp.net,C#,Asp.net,关于更清楚的解释,这里是我在.asp文件中的代码: <asp:UpdatePanel ID="updPnlTabs" runat="server" > <Triggers> <asp:PostBackTrigger ControlID="btnSave" /> </Triggers> <ContentTemplate> <asp:Panel ID="pnlCheckList" runat="serve

关于更清楚的解释,这里是我在
.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>
现在我的问题是,当我更改复选框时,整个页面必须加载,而不是
UpdatePanel
的内容。请注意,动态创建的复选框的EventHandler正在启动,但不在UpdatePanel内


如何在
UpdatePanel
中添加动态创建的
控件的
ID

无法将动态(或编程创建的)控件添加到标记中,因此,创建后必须向
ScriptManager
注册该控件

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

要以编程方式注册回发控件,请使用
ScriptManager
控件的
RegisterAsyncPostBackControl
方法。然后在控件发回时调用
UpdatePanel
控件的更新方法


基本上,您应该做的是在创建复选框控件之后注册它

// 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\u OnRow\u检查
回调/eventhandler函数中,确保调用
UpdatePanel1.Update()

更新2013-02-20

由于我对您接收到的异常的理解,请考虑使复选框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"));

您尝试过方法吗?我已经尝试声明
AsyncPostBackTrigger
对象,然后我为其分配了
ControlID
,但当我将其添加到
UpdatePanel
时,在重新加载或回发时出现问题。我创建的对象又被添加了。你是否阅读了答案[这里]:()我不明白,但它仍然继续添加相同的触发器。@BlackHatShadow你的意思是每次都添加触发器,还是你看到了其他副作用?你能详细说明一下吗?当我尝试填充面板(包括触发器)时,触发器再次添加,导致多个
ID的运行时错误
如何检查我的UpdatePanel中是否存在触发器?顺便说一下,谢谢你的关注和努力。你能更新一下你收到的问题吗?此外,请确保chkModuleID具有唯一的ID,请参阅2013-02-20更新。