vini
vini

Reputation: 4722

Dynamically generated Button click not getting called?

I have associated a Button ID while generating Buttons dynamically and created a Button event handler as follows:

btn.Click += new EventHandler(btn_Click);

Button Click event:

protected void btn_Click(object sender,EventArgs e)
{
    Button b = new Button();
    b = (Button)sender;
    string i = b.ID.Substring(b.ID.Length - 1, 1);
    int j1 =Convert.ToInt32(i);
    id1 = to[j1];
    Page.ClientScript.RegisterClientScriptBlock(Type.GetType("System.String"), 
        "addScript", "PassValues('" + id1 + "')", true);
    ScriptManager.RegisterStartupScript(this, this.GetType(), 
       "sendMessage", "javascript:sendMessage(); ", true);
}

However this event is not getting called i have placed all my controls inside an UpdatePanel

EDIT: What is happening is on button click somehow a function is getting called which is present on Page.Load

protected void getEntriesRight()
{
    j = (int)Session["j"];

    int n1 = j + 3;

    for (; j <= n1; j++)
    {
        if (j < fr.data.Length)
        {
            HtmlGenericControl listItem = new HtmlGenericControl("li");
            HtmlGenericControl a1 = new HtmlGenericControl("a");
            Label anchor = new Label();
            Image im = new Image();

            btn = new Button();
            im.ImageUrl = fr.data[j].pic_square;
            im.Height = 45;
            im.Width = 47;


            btn.CssClass = "btn-add";
            btn.Text = "Invite";
            to[j] = fr.data[j].uid;

            btn.ID = "btn" + j;


            a1.Attributes.Add("href", "#");
            anchor.Text = fr.data[j].name;
            a1.Controls.Add(btn);
            a1.Controls.Add(im);
            a1.Controls.Add(anchor);
            listItem.Controls.Add(a1); 
            list.Controls.Add(listItem);

                btn.Click += new EventHandler(btn_Click);

        }
    }

    Session["j"] = j;
}

Help!

Upvotes: 2

Views: 1036

Answers (1)

mellamokb
mellamokb

Reputation: 56769

Dynamically generated controls have to be recreated on every postback in order for their events to fire. This is one of the most commonly-encountered problems with generating controls programmatically in .NET, and it is discouraged if you can find a way around it.

For example, if you have a button that should only be present when another button is clicked, have the button in the page to begin with, and use the Visible property to control whether it is shown or not.


Regarding your edit. Every post-back to the server, even inside an UpdatePanel, is going to call Page_Load. If you want to detect whether a request has come from an UpdatePanel then you need to check !Page.IsAsync before calling the function.

Upvotes: 9

Related Questions