1

ペインの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に含まれるリストビューには、LinkBut​​tonがクリックされるまでデータソースがバインドされません。これにより、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内のLinkBut​​tonがクリックされたときに、データソースをバインドできるように、何らかの方法でListViewの正しいインスタンスへの参照を取得する必要があります。いつものように、どんな助けや洞察も大歓迎です。これは私の前の質問に似ていますが、データバインド後にこの参照を取得することに固有であり、少し複雑に見えます。TIA

更新:どういうわけかそのインデックスをキャプチャできれば、アイテムのデータソースをバインドできることがわかりました。内部アコーディオンのデータバインディング中に、これをコマンド引数として設定しようとしています。

4

1 に答える 1

0

私はいくつかのマイナーなシェナンガンでこれを解決することができました:

マークアップは次のとおりです。

<ItemTemplate>
    <div class="ReviewerItem">
        <%#Eval("Assignee.Name") %><br />
        <div style="display: inline-block; position: relative;">
            <img src="" alt="Reviewer" runat="server" ID="imgReviewer" width="75" style="border: 1px solid lightgray; border-radius: 6px; overflow: hidden;"/><br />    
            <div runat="server" ID="divYes" Visible="False">
                <img src="../Images/Yes.png" alt="Approved" class="ApprovalIcon"  />
            </div>
            <div runat="server" ID="divNo" Visible="False">
                <img src="../Images/No.png" alt="Rejected" class="ApprovalIcon" id="imgNo" />
            </div>
        </div>
        <asp:Label runat="server" ID="lblStatus" Text='<%#Eval("ReviewStatus") %>' />
        <asp:HyperLink runat="server" ID="lnkRejectComment" CssClass="InitialRejectComment">(details)</asp:HyperLink>
        <asp:Panel runat="server" ID="pnlDemoApproval" Visible="False" CssClass="DemoButtons">
            <asp:Button runat="server" ID="btnApprove" Text="Approve" CommandArgument='<%#Eval("Assignee.Guid") + "|" + Eval("Ticketid") %>' CommandName="ApproveReview"/>
            <asp:Button runat="server" ID="btnDeny" Text="Deny" CommandArgument='<%#Eval("Assignee.Guid") + "|" + Eval("Ticketid") %>' CommandName="DenyReview"/>
        </asp:Panel>
        <ajaxToolkit:BalloonPopupExtender runat="server" ID="balloon" BalloonPopupControlID="pnlPopup"
        TargetControlID="lnkRejectComment" Position="TopRight" BalloonStyle="Cloud" BalloonSize="Medium" DisplayOnMouseOver="True"/>
        <asp:Panel runat="server" ID="pnlPopup">Rejection Reason</asp:Panel>
    </div>
</ItemTemplate>

データ バインドでは、アイテムをキャッチして、インデックスを取得し、後で使用するために CommandName に設定できるようにします。

AjaxControlToolkit.AccordionItemEventArgs e)
{
    if (e.ItemType != AjaxControlToolkit.AccordionItemType.Content) return;
    var index = e.ItemIndex;
    var button = e.AccordionItem.Parent.FindControl("lnkbHeader") as LinkButton;
    if (button != null) button.CommandName = index.ToString();
}

コントロールにインデックスが含まれるようになったので、それを使用して正しいペインをターゲットにし、そのデータソースをバインドできます。

protected void accReviewers_ItemCommand(object sender, CommandEventArgs e)
{
    //This seems stupid to put here, but for some reason the item command bypasses the listview catch and passes it to the accordion

    if (e.CommandName == "ApproveReview")
    {
        var assigneeGuid = new Guid(e.CommandArgument.ToString().Split('|')[0]);
        var ticketId = int.Parse(e.CommandArgument.ToString().Split('|')[1]);
        var ticket = new MocApproval(ticketId);
        DoDemoApproval(ticketId, assigneeGuid, true);
        var approvalIndex = (sender as AjaxControlToolkit.Accordion).SelectedIndex;
        var lv =
            (sender as AjaxControlToolkit.Accordion).Panes[approvalIndex].FindControl("lvReviewers") as ListView;
        lv.DataSource = MocApi.GetReviews(ticket.MocRequest);
        lv.DataBind();
        return;
    }
    if (e.CommandName == "DenyReview")
    {
        var assigneeGuid = new Guid(e.CommandArgument.ToString().Split('|')[0]);
        var ticketId = int.Parse(e.CommandArgument.ToString().Split('|')[1]);
        var ticket = new MocApproval(ticketId);
        DoDemoApproval(ticketId, assigneeGuid, false);
        var approvalIndex = (sender as AjaxControlToolkit.Accordion).SelectedIndex;
        var lv =
            (sender as AjaxControlToolkit.Accordion).Panes[approvalIndex].FindControl("lvReviewers") as ListView;
        lv.DataSource = MocApi.GetReviews(ticket.MocRequest);
        lv.DataBind();
        return;
    }

    ...
于 2012-09-04T17:56:56.017 に答える