C# 在动态创建的accordionpane中使用动态创建按钮的单击事件

C# 在动态创建的accordionpane中使用动态创建按钮的单击事件,c#,asp.net,ajaxcontroltoolkit,C#,Asp.net,Ajaxcontroltoolkit,我有一个生成accordionpane和Panel的方法,在每个accordionpane中我创建了一个按钮。这个方法我在listviewselectedindexchanged方法中使用它来创建order对象并填充body面板 protected void PanelCreator(Order order, List<Panel> pnllist) { Panel panelHead = new Panel(); panelHead.ID = "pH" + orde

我有一个生成accordionpane和Panel的方法,在每个accordionpane中我创建了一个按钮。这个方法我在listviewselectedindexchanged方法中使用它来创建order对象并填充body面板

protected void PanelCreator(Order order, List<Panel> pnllist)
{
    Panel panelHead = new Panel();
    panelHead.ID = "pH" + order.product;
    panelHead.CssClass = "cpHeader";

    //Add Label inside header panel to display text
    Label lblHead = new Label();
    lblHead.ID = order.product;
    lblHead.Text = order.productName + " €" + order.priceValue;
    panelHead.Controls.Add(lblHead);
    //Create Body Panel

    Panel panelBody = new Panel();
    panelBody.ID = "pB" + order.product;
    panelBody.CssClass = "cpBody";

    AccordionPane ap = new AccordionPane();


    foreach (Panel p in pnllist)
    {
        panelBody.Controls.Add(p);

    }

    Button btn = new Button();
    btn.ID = "btn" + order.product;

    btn.Text = "Toevoegen";
    btn.Click += new EventHandler(btn_Click);
    panelHead.Controls.Add(btn);


    ap.ID = "ap" + order.product;
    ap.HeaderContainer.Controls.Add(panelHead);
    ap.ContentContainer.Controls.Add(panelBody);
    accMenu.Panes.Add(ap);

}
}

这是我的aspx页面:

 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
            <asp:Panel ID="Panel1" runat="server"></asp:Panel>
            <asp:Label ID="nameLabel" runat="server" Text="aa" />

            <div style="overflow-x: auto;">
                <asp:ListView ID="ListView1" runat="server" DataKeyNames="main_product_id" DataSourceID="odsMainProduct" OnSelectedIndexChanged="ListView1_SelectedIndexChanged">
                    <ItemTemplate>
                        <stackpanel orientation="Horizontal" />
                        <td>
                            <asp:LinkButton ID="lnkSelect" runat="server" CommandName="Select" Font-Overline="false" Font-Bold="true" Font-Size="15px" Height="30px" Text='<%# Eval("name") %>' />
                            <%--<asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />--%></td>
                    </ItemTemplate>
                    <LayoutTemplate>
                        <table runat="server">
                            <tr runat="server">
                                <td runat="server">
                                    <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                                        <tr runat="server" style="color: white; text-align: left; width: auto">
                                        </tr>
                                        <tr id="itemPlaceholder" runat="server">
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                            <tr runat="server">

                                <td runat="server" style=""></td>
                            </tr>
                        </table>

                    </LayoutTemplate>

                    <SelectedItemTemplate>
                        <td>
                            <asp:LinkButton ID="lnkSelect0" runat="server" CommandName="Select" Font-Overline="false" Font-Size="20px" ForeColor="red" Height="30px" Text='<%# Eval("name") %>' />
                            <%--<asp:Label ID="nameLabel"  runat="server" Text='<%# Eval("name") %>' />--%></td>
                    </SelectedItemTemplate>
                </asp:ListView>
            </div>
            <asp:ObjectDataSource ID="odsMainProduct" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetMainProducts" TypeName="MainProductBLL"></asp:ObjectDataSource>
            <asp:Accordion ID="accMenu" runat="server"></asp:Accordion>

        </ContentTemplate>

    </asp:UpdatePanel>

--%>
--%>

您需要将按钮创建数据存储在
视图状态中,以便在页面加载事件中创建这些控件,之后按钮单击将被正确处理

订单
类应标记为可序列化

public Order SelectedOrder
    {
        get
        {               
            return ViewState["StoredOrder"] == null ? (Order)ViewState["StoredOrder"] : null;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {

        if (SelectedOrder != null)
        {

            PanelCreator(SelectedOrder);
        }
    }




  protected void listviewselectedindexchanged(object sender, System.EventArgs e)
        {
         // I am not  sure how you got order in this event, you should use your version of code, but idea is the same
         ViewState["StoredOrder"] = sender as Order;
         PanelCreator(SelectedOrder);
        }

何时调用
PanelCreator
?我指的是网页的生命周期,它应该在页面加载事件之前(或者至少在这个事件期间)完成,但在处理
Control PostBack事件之前,
在每个listviewselectedindexchanged上调用它。我知道控件需要在page_load中创建,但我如何解决这个问题?您需要将按钮创建数据存储在ViewState中,以便在page load事件中创建这些控件,之后将处理按钮单击。正确的顺序类应标记为
可序列化
,以便正常使用ViewState中存储的数据
public Order SelectedOrder
    {
        get
        {               
            return ViewState["StoredOrder"] == null ? (Order)ViewState["StoredOrder"] : null;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {

        if (SelectedOrder != null)
        {

            PanelCreator(SelectedOrder);
        }
    }




  protected void listviewselectedindexchanged(object sender, System.EventArgs e)
        {
         // I am not  sure how you got order in this event, you should use your version of code, but idea is the same
         ViewState["StoredOrder"] = sender as Order;
         PanelCreator(SelectedOrder);
        }