0

プログラムで追加されたユーザー コントロール内に含まれるボタンのクリック イベントを発生させる際に問題が発生しています。新しいユーザー コントロールが追加されるたびにイベントを接続する必要があることを理解しています。それを行っていると確信していますが、まだ何もしていません。ボタンのクリック イベントは、プログラムによって追加されていない最初のユーザー コントロールに対して正常に機能します。ユーザーコントロールのマークアップは次のとおりです....

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

..ご覧のとおり、既に 1 つの AddressUserControl が宣言的に含まれています。btnAddAddress をクリックすると、後続のすべての AddressUserControls が phAddresses に追加されます。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";
    }

編集 - わかりましたので、イベントハンドラの割り当てを btnAddAddress_Click 内ではなく Page_PreInit に移動しました....

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

ただし、これが問題を解決した理由や方法については完全には明らかではありません。

4

1 に答える 1