использование события нажатия динамически созданной кнопки внутри динамически создаваемой аккордеонной панели - PullRequest
0 голосов
/ 06 января 2020

У меня есть метод, который генерирует аккордеонные панели и панели, и внутри каждой аккордеонной панели я создаю кнопку. Этот метод, который я использую в методе listviewselectedindexchange, чтобы создать объект заказа и заполнить панель тела

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

}

Я пытаюсь добраться до события нажатия каждой кнопки, но не знаю, как это сделать.

У меня есть этот метод для события click, чтобы проверить метку внутри панели обновления, но не работает

 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>

1 Ответ

0 голосов
/ 06 января 2020

Вам необходимо сохранить данные о создании кнопок в 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);
        }
...