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には、コントロールのメソッドを使用しScriptManagerます。UpdatePanel次に、コントロールがポストバックしたときに、コントロールのUpdateメソッドを呼び出します。


基本的には、チェックボックスコントロールを作成した後に登録する必要があります。

// 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 callback / 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"));
于 2013-02-20T04:30:48.793 に答える