Программно добавленное событие щелчка в пользовательском элементе управления не будет запускаться

У меня возникли проблемы с получением события click для кнопки, содержащейся в программно добавленном пользовательском элементе управления. Я понимаю, что событие должно быть связано каждый раз, когда добавляется новый пользовательский элемент управления, и я почти уверен, что делаю это, но все равно ничего. Событие click для кнопки отлично работает для первого пользовательского элемента управления, который программно не добавляется. Вот разметка для пользовательского элемента управления....

<asp:Panel ID="pnlAddressForm" runat="server">
    <asp:Label ID="lblStreet" runat="server" Text="Street Address"></asp:Label>
    <asp:TextBox ID="txtStreet" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Label ID="lblCity" runat="server" Text="City"></asp:Label>
    <asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Label ID="lblState" runat="server" Text="State"></asp:Label>
    <asp:TextBox ID="txtState" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Label ID="lblZip" runat="server" Text="Zip"></asp:Label>
    <asp:TextBox ID="txtZip" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Button ID="btnRemoveAddress" runat="server" Text="Remove Address" OnClick="btnRemoveAddress_Click" />
</asp:Panel>

... и вот разметка для главной страницы...

<form id="form1" runat="server">
    <div>
        <My:FormUserControl runat="server" ID="myFormUserControl" />
        <br /><br />
        <hr />
        <My:AddressUserControl runat="server" ID="myAddressUserControl" />
        <br /><br />
        <asp:PlaceHolder ID="phAddresses" runat="server"></asp:PlaceHolder>
        <br /><br />
        <asp:Button ID="btnAddAddress" runat="server" Text="Add Another Address" OnClick="btnAddAddress_Click" />
    </div>
        <br /><br />
        <hr />
        <asp:Button ID="btnSubmit" runat="server" Text="Create PDF" OnClick="btnSubmit_Click" />
    </form>

... как вы видите, он уже декларативно содержит один AddressUserControl. Все последующие AddressUserControls добавляются в phAddresses после нажатия btnAddAddress. AddressUserControls добавляются таким образом в код позади...

    private static List<AddressUserControl> addresses = new List<AddressUserControl>();

protected void Page_PreInit(object sender, EventArgs e)
        {
    int addressCount = 0;
                foreach (AddressUserControl aCntrl in addresses)
                {
                    Literal ltlSpace = new Literal();
                    ltlSpace.Text = "<br /><br />";
                    phAddresses.Controls.Add(aCntrl);
                    phAddresses.Controls.Add(ltlSpace);
                    addressCount++;
                }
}

When btnAddAddress is click this event handler runs...

        protected void btnAddAddress_Click(object sender, EventArgs e)
        {
            AddressUserControl aCntrl = LoadControl("~/UserControls/AddressUserControl.ascx") as AddressUserControl;
            findAddressControlRemoveButton(aCntrl);
            addressUserControlButton.ID = "btnRemoveAddress" + addresses.Count + 1;
            addressUserControlButton.Click += new EventHandler(addressUserControlButton_Click);
            addresses.Add(aCntrl);
        }

... и вот обработчик события addressUserControlButton. Это никогда не запускается, я полагаю, я не добавляю это правильно в вышеупомянутом обработчике?

    private void addressUserControlButton_Click(object sender, EventArgs e)
    {
        Button thisButton = sender as Button;
        thisButton.Text = "Why Hello";
    }

РЕДАКТИРОВАТЬ - Хорошо, поэтому я переместил назначение обработчика событий в Page_PreInit вместо внутри btnAddAddress_Click, вот так....

 protected void Page_PreInit(object sender, EventArgs e)
{

            int addressCount = 0;
            foreach (AddressUserControl aCntrl in addresses)
            {
                Literal ltlSpace = new Literal();
                ltlSpace.Text = "<br /><br />";
                phAddresses.Controls.Add(aCntrl);
                findAddressControlRemoveButton(aCntrl);
                addressUserControlButton.ID = "btnRemoveAddress" + addressCount;
                addressUserControlButton.Click += new EventHandler(addressUserControlButton_Click);
                phAddresses.Controls.Add(ltlSpace);
                addressCount++;
            }
        }

Не совсем понятно, почему или как это решило проблему.

1 ответ

Когда вы добавляете какой-либо элемент управления программным способом, вам необходимо зарегистрировать событие click после этого.

Другие вопросы по тегам