2016-07-22 10 views
0

現在、UpdatePanelの問題に対処しています。私のページの1つに、AとBと呼ばれる2つのユーザーコントロールがあります。ユーザーコントロール、デリゲート、UpdatePanel問題

ユーザーコントロールAには、複数のASP TextBoxを含むUpdatePanelがあります。

<asp:UpdatePanel ID="upA" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true" style="position: relative;"> 
    <ContentTemplate> 
     <-- content here --> 
    </ContentTemplate> 
</asp:UpdatePanel> 

ユーザーコントロールBには、PanelとAjaxModalPopupがリンクされたUpdatePanelがあります。パネルには、リピーターとASPボタンがあります。

<asp:UpdatePanel runat="server" ID="upB" UpdateMode="Conditional"> 
<ContentTemplate> 
    <asp:Button ID="btnActivePopupContainer" runat="server" Style="display: none;" /> 
    <asp:Panel ID="pnlPopupContainer" runat="server" CssClass="modalPopup modalPopupDraggable" Style="display: none;" Width="750px"> 
     <asp:UpdatePanel ID="upPopup" runat="server" UpdateMode="Conditional"> 
      <ContentTemplate> 
       <asp:Panel runat="server" ID="pnlHeader" class="header"> 
        <asp:Label ID="Label1" runat="server" Text="<%$ Resources:global, AttentionPopup %>"></asp:Label> 
       </asp:Panel> 
       <article> 
        <asp:Repeater runat="server" ID="rptPopup" OnItemDataBound="rptPopup_ItemDataBound"> 
         <ItemTemplate> 
          <-- Content --> 
         </ItemTemplate> 
        </asp:Repeater> 
       </article> 
       <footer> 
        <div class="or-spacer"> 
         <div class="mask"></div> 
        </div> 
        <div class="footer"> 
         <asp:Panel runat="server" ID="pnlBtnBug"> 
          <asp:Button ID="btnOK" runat="server" CssClass="btn yes" Text="<%$ Resources:global, Ok %>" OnClick="btnOK_Click" /> 
         </asp:Panel> 
        </div> 
       </footer> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </asp:Panel> 
    <ajax:ModalPopupExtender ID="popupContainer" runat="server" BackgroundCssClass="modalBackground" PopupControlID="pnlPopupContainer" TargetControlID="btnActivePopupContainer" Drag="true" PopupDragHandleControlID="pnlHeader"></ajax:ModalPopupExtender> 
</ContentTemplate> 

ユーザーがユーザーコントロールBのOKボタンをクリックすると、それはいくつかのフィールドの更新とのUpdatePanel「UPAの更新方法を実行するユーザーコントロールA内のメソッドを呼び出すデリゲートをトリガ"

デリゲート:背後にあるユーザーコントロールAのコードで

//Delegate Call When the user clicks the ok Button 
popup.okHandler = (x) => 
{ 
    A.ChooseOpticienCode(x.Value); 
}; 

public void ChooseOpticienCode(string code) 
{ 
    <-- some treatments -- > 
    upOpticien.Update(); <-- crash here 
} 

方法upOpticien.Update()が呼び出されると、私はこのエラーを取得:

System.InvalidOperationException: The Update method can only be called on UpdatePanel with ID 'upOpticien before Render. 

このエラーがなぜ発生するのか分かりません。私はUpdatePanelのUpdateModeを "Always"に設定しようとしましたが、アプリケーションはもはやクラッシュしませんでしたが、フィールドは更新されません。

アイデア?

+0

なぜ、トリガを設定するのではなく、手動でUpdatePanelを更新しようとしていますか?それにもかかわらず、ページライフサイクルのその部分で.Update()メソッドを実行できないというエラーが表示されているようです。あなたは、その方法に関する文書を見つけたり、読んだりしてみるべきです。 – Seano666

+0

UpdatePanelに含まれているすべてのTextboxの値を変更するコードがあるため、手動で更新しようとしています。 したがって、コードビハインドで値が変更されるため、イベントは開始されないため、トリガーはここでは不要です。 – TheNawaKer

答えて

0

私は最終的に私の問題を解決する方法を見つけました。代わりに、直接、デリゲートを呼び出すので、私は、デリゲートが正しく実行されるように、InvokeMember機能を使用する必要がありますし、様々なフィールドを編集することができます。しかし

page.GetType().InvokeMember(OkHandler.Method.Name, System.Reflection.BindingFlags.InvokeMethod, null, page, new[] { this }); 

(ここでは、OkHandlerは私の代理人である)のUpdatePanel

を更新します匿名メソッドを使用しても機能しないことに注意してください。デリゲートがInvokeMemberの名前を持つメソッドを指し示すことは必須です。

関連する問題