首页 > 解决方案 > 在动态创建的手风琴窗格内使用动态创建的按钮的点击事件

问题描述

我有一个生成手风琴和面板的方法,在每个手风琴内我创建了一个按钮。这个方法我在 listviewselectedindexchanged 方法中使用它来创建订单对象并填充正文面板

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);

}

我正在尝试访问每个按钮的单击事件,但不知道该怎么做。

对于单击事件,我有这种方法来测试更新面板内的标签但不起作用

 protected void btn_Click(object sender, EventArgs e)
{

     nameLabel.Text = "testinf";

}

这是我的 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>

标签: c#asp.netajaxcontroltoolkit

解决方案


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

Order类应标记为Serializable

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);
        }

推荐阅读