ペインの1つに別のアコーディオンがあるアコーディオンがあります。この内部アコーディオンはデータソースを使用して作成されるため、その各ペインはオブジェクトのリストからロードされます。この特定のケースでは、このデータソースもオンデマンドでロードされます。さて、私が立ち往生しているのは、ペインヘッダーのみをロードし、ペインがクリックされたときにコンテンツをロードできるようにしたいということです。外側のペインにあるものと似ています。ここで混乱する理由は、ペインがクリックされたときに遅延読み込みが発生するためですが、これはデータバインド後に発生するため、ItemCommandを呼び出すペインのコンテンツを参照する方法がわかりません。それが理にかなっているかどうかはわかりません。これが内側のアコーディオンです:
<ajaxToolkit:Accordion runat="server" ID="accReviewers" OnItemDataBound="accOuterAccordion_ItemDataBound" ContentCssClass="ReviewerContent" RequireOpenedPane="False" SelectedIndex="-1" OnItemCommand="accReviewers_ItemCommand">
<HeaderTemplate>
<div>
<asp:LinkButton Text='<%#Eval("Header") %>' CssClass="InReviewHeader" runat="server"
CommandName="LoadReviewers" CommandArgument='<%#Eval("MocRequestId") %>'/>
</div>
</HeaderTemplate>
<ContentTemplate>
<div>
<asp:ListView runat="server" ID="lvReviewers" ItemPlaceholderID="phReviewer" OnItemDataBound="lvReviewers_ItemDataBound">
<LayoutTemplate>
<div>
<asp:HyperLink runat="server" ID="lnkGotoRequest" Text="View this request"/>
</div>
<asp:PlaceHolder runat="server" ID="phReviewer"/>
<div style="margin-top: 5px;">
<asp:Button runat="server" ID="btnResubmit" Text="Resubmit" CssClass="ResubmitInitial"/>
</div>
</LayoutTemplate>
<ItemTemplate>
<div class="ReviewerItem">
<%#Eval("Assignee.Name") %><br />
<img src="" alt="Reviewer" runat="server" ID="imgReviewer" width="75" style="border: 1px solid gray; border-radius: 6px;"/><br />
<asp:Label runat="server" ID="lblStatus" Text='<%#Eval("ReviewStatus") %>' />
<asp:HyperLink runat="server" ID="lnkRejectComment" CssClass="InitialRejectComment">(details)</asp:HyperLink>
</div>
</ItemTemplate>
</asp:ListView>
</div>
</ContentTemplate>
</ajaxToolkit:Accordion>
</Content>
</ajaxToolkit:AccordionPane>
ご覧のとおり、アコーディオンaccReviewersはデータソースを介して生成されます。LayoutTemplateに含まれるリストビューには、LinkButtonがクリックされるまでデータソースがバインドされません。これにより、itemコマンドが実行されます。また、このアコーディオン全体がUpdatePanelにラップされていることにも注意してください。
これは私が作業を始めた背後にあるコードですが、リストビューの正しいインスタンスを取得していないようで、リストが空でない間は何も表示されません。
protected void accReviewers_ItemCommand(object sender, CommandEventArgs e)
{
var mocId = int.Parse(e.CommandArgument.ToString());
var list = (sender as AjaxControlToolkit.Accordion).FindControl("lvReviewers") as ListView; //APPARENTLY WRONG
var reviewers = MocApi.GetReviews(mocId);
list.DataSource = reviewers;
list.DataBind();
}
要約すると、HeaderTemplate内のLinkButtonがクリックされたときに、データソースをバインドできるように、何らかの方法でListViewの正しいインスタンスへの参照を取得する必要があります。いつものように、どんな助けや洞察も大歓迎です。これは私の前の質問に似ていますが、データバインド後にこの参照を取得することに固有であり、少し複雑に見えます。TIA
更新:どういうわけかそのインデックスをキャプチャできれば、アイテムのデータソースをバインドできることがわかりました。内部アコーディオンのデータバインディング中に、これをコマンド引数として設定しようとしています。