0

通常、ItemDataboundでListViewの要素にアクセスしようとすると、e.Item.FindControl( "myControl")と言うのと同じくらい簡単ですが、ajaxtoolkitのアコーディオンを使用するとうまくいかないようです。

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

    <ajaxToolkit:Accordion runat="server" ID="accOuterAccordion" OnItemDataBound="accOuterAccordion_ItemDataBound">
        <HeaderTemplate>
            <asp:Label runat="server" Text='<%#Eval("Header") %>'/>
        </HeaderTemplate>
        <ContentTemplate>
            <asp:ListView runat="server" ID="lvReviewers" ItemPlaceholderID="phReviewer">
                <LayoutTemplate>
                    <ul>
                        <asp:PlaceHolder runat="server" ID="phReviewer"/>
                    </ul>
                </LayoutTemplate>
                <ItemTemplate>
                    <li>
                        <asp:Label runat="server" ID="lblReviewer" Text='<%#Eval("Assignee.Name") %>'/>
                    </li>
                </ItemTemplate>
            </asp:ListView>
        </ContentTemplate>
    </ajaxToolkit:Accordion>

OnItemDataBoundイベントのコードビハインドは次のとおりです。

   protected void accOuterAccordion_ItemDataBound(object sender, AjaxControlToolkit.AccordionItemEventArgs e)
    {
        var item = e.AccordionItem.DataItem as MocRequest;
        var innerList = e.AccordionItem.FindControl("lvReviewers") as ListView;
        innerList.DataSource = MocApi.GetReviews(item.MocRequestID);
        innerList.DataBind();
    }

コードをステップスルーすると、アイテムはロードされたアイテムを正しく取得しています。ただし、innerListはnullとして返されます。何か案は?

4

1 に答える 1

1

クラスのItemTypeプロパティを確認してください。AccordionItemEventArgs

void Accordion1_ItemDataBound(object sender, AjaxControlToolkit.AccordionItemEventArgs e)
{
    if (e.ItemType == AjaxControlToolkit.AccordionItemType.Content)
    {
        var item = e.AccordionItem.DataItem as MocRequest;
        var innerList = e.AccordionItem.FindControl("lvReviewers") as ListView;
        innerList.DataSource = MocApi.GetReviews(item.MocRequestID);
        innerList.DataBind();
    }
}
于 2012-08-16T15:37:47.893 に答える