如何在asp.net中的Accordion中插入UserControl?

时间:2016-11-02 18:39:29

标签: asp.net webforms webforms-view-engine

我有一个如下所示的用户控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ProfileGroupComponent.ascx.cs" Inherits="Reports.Controls.ProfileGroupComponent" %>

<ajaxToolkit:AccordionPane ID="accordionPane" runat="server">
    <Header>
        <asp:Table ID="Table1" runat="server">
            <asp:TableHeaderRow  runat="server">
                <asp:TableHeaderCell>
                    <asp:Label ID="lblHeader" runat="server">
                </asp:Label>
                </asp:TableHeaderCell>
                <asp:TableHeaderCell>
                    <asp:Label ID="Label3" runat="server" Text="Frecuency: "></asp:Label>
                    <asp:Label ID="lblFrecuency" runat="server"></asp:Label>
                </asp:TableHeaderCell>
                <asp:TableHeaderCell>
                    <asp:Label ID="Label7" runat="server" Text="Nxt Invoice Dt: "></asp:Label>
                    <asp:Label ID="lblNxtInvoiceDt" runat="server"></asp:Label>
                </asp:TableHeaderCell>
                <asp:TableHeaderCell>
                   <asp:Label ID="Label9" runat="server" Text="Not Consolidated:"></asp:Label>
                    <ajaxToolkit:ComboBox ID="cmbNotConsolidated" runat="server" AutoCompleteMode="Suggest"></ajaxToolkit:ComboBox>
                </asp:TableHeaderCell>
                <asp:TableHeaderCell>
                     <asp:Button ID="btnPayorDetails" runat="server" Text="Payor Details" OnClick="btnPayorDetails_OnClick"/>
                </asp:TableHeaderCell>
            </asp:TableHeaderRow>
        </asp:Table>
    </Header>
    <Content>
        <asp:BulletedList ID="bltListDeitals" runat="server">

        </asp:BulletedList>
    </Content>
</ajaxToolkit:AccordionPane>

据说我有一个带有手风琴的页面

<ajaxToolkit:Accordion ID="MyAccordion" runat="server" SelectedIndex="0" HeaderCssClass="accordionHeader"
                    HeaderSelectedCssClass="accordionHeaderSelected" ContentCssClass="accordionContent"
                    FadeTransitions="false" FramesPerSecond="40" TransitionDuration="250" AutoSize="None"
                    RequireOpenedPane="false" SuppressHeaderPostbacks="true" Width="1880">
                    <Panes>
                        <uc1:ProfileGroupComponent runat="server" ID="ProfileGroupComponent" />
                    </Panes>
                </ajaxToolkit:Accordion>

我正在尝试在Panes标记内插入UserControl,但页面不会呈现它,而是我收到错误:

分析器错误消息:AjaxControlToolkit.AccordionPaneCollection必须具有“AjaxControlToolkit.AccordionPane”类型的项目。 'uc1:ProfileGroupComponent'的类型为'ASP.controls_profilegroupcomponent_ascx'。

背后的想法是动态添加多个窗格,但使用一致的UI,我可以在其中编辑控件并更改外观。有没有安全的方法呢?

1 个答案:

答案 0 :(得分:0)

错误消息表明AccordionPanes期望收集AccordionPane项,而不是您的自定义用户控件。

有几种方法可以解决此问题。

  1. 让您的手风琴控制器成为ASCX控件的一部分。 这种方法的一个好处是你不再需要将Accordion控制自己分成多个部分,我认为这首先是有点尴尬。然后,您可以在自己的ASCX控件内使用Accordion。

  2. 更改ASPX页面和ASCX控件的标记代码。通过这样做,您需要将AccordionPane项模板移动到ASPX页面,并将ASCX仅作为内容控件。如果需要在应用程序中的其他位置重用它,您还可以尝试创建标题内容ASCX控件。所以最终归结为这样的事情。

  3. 示例:

    <ajaxToolkit:Accordion ID="MyAccordion" runat="server" SelectedIndex="0" HeaderCssClass="accordionHeader" HeaderSelectedCssClass="accordionHeaderSelected" ContentCssClass="accordionContent" FadeTransitions="false" FramesPerSecond="40" TransitionDuration="250" AutoSize="None" RequireOpenedPane="false" SuppressHeaderPostbacks="true" Width="1880"> 
         <Panes>
              <asp:AccordionPane ID="AccordionPane1" runat="server">
                 <Header><uc1:HeaderCtrl runat="server" ID="myHeader" /></Header>
                 <Content><uc1:ContentCtrl runat="server" ID="myContent" />
                 </Content>
              </asp:AccordionPane>   
         </Panes>
    </ajaxToolkit:Accordion>
    
    1. 考虑在背后的代码中动态添加AccordionPane。这当然更具挑战性,因为您需要编写更多代码。但如果您有相对复杂的逻辑来确定如何在页面上呈现Accordion,那么对您来说会更有力量。
    2. 您可以查看此链接以获取有关此技术的更多详细信息:
      https://www.asp.net/web-forms/overview/ajax-control-toolkit/accordion/dynamically-adding-an-accordion-pane-cs