Event Handler that creates adds another event handler

Discussion in 'ASP .Net' started by kaczmar2@gmail.com, Feb 22, 2007.

  1. Guest

    I have an ASP.NET page where controls are created dynamically, and I
    have an issue where one event handler creates another set of controls,
    and then adds event handlers to those controls. The problem comes in
    where I need to raise the event in the second control - the event does
    not fire. I have distilled the example below down to it simplest:

    on Page_Load one button is created, and a Click event hander is added
    to the button. When this first button is clicked, it adds another
    button and adds another onclick event for this new button.

    The first time through, everything works - The first button is
    clicked, and then the second button is added with its event handler.
    The problem comes on this second postback - the Page_Load event fires,
    but not the first button's event - the one the creates the second
    button and EventHandler.

    How can I get around this? How can I add controls and event handlers
    from an event hander? Code is below:

    <%@ Page Language="C#" %>

    <script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
    Button button1 = new Button();
    button1.ID = "button1";
    button1.Text = "Button 1";
    button1.Click += new EventHandler(button1_Click);
    main.Controls.Add(button1); // main is the div
    }

    void button1_Click(object sender, EventArgs e)
    {
    Button button2 = new Button();
    button2.ID = "button2";
    button2.Text = "Button 2";
    button2.Click += new EventHandler(button2_Click);
    main.Controls.Add(button2); // main is the div
    }

    void button2_Click(object sender, EventArgs e)
    {
    // this event handler is never hit.
    }

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>EventHandler Test</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div id="main" runat="server"></div>
    </form>
    </body>
    </html>
    , Feb 22, 2007
    #1
    1. Advertising

  2. Damien Guest

    On Feb 22, 2:00 am, wrote:
    > I have an ASP.NET page where controls are created dynamically, and I
    > have an issue where one event handler creates another set of controls,
    > and then adds event handlers to those controls. The problem comes in
    > where I need to raise the event in the second control - the event does
    > not fire. I have distilled the example below down to it simplest:
    >
    > on Page_Load one button is created, and a Click event hander is added
    > to the button. When this first button is clicked, it adds another
    > button and adds another onclick event for this new button.
    >
    > The first time through, everything works - The first button is
    > clicked, and then the second button is added with its event handler.
    > The problem comes on this second postback - the Page_Load event fires,
    > but not the first button's event - the one the creates the second
    > button and EventHandler.
    >
    > How can I get around this? How can I add controls and event handlers
    > from an event hander? Code is below:
    >
    > <%@ Page Language="C#" %>
    >
    > <script runat="server">
    > protected void Page_Load(object sender, EventArgs e)
    > {
    > Button button1 = new Button();
    > button1.ID = "button1";
    > button1.Text = "Button 1";
    > button1.Click += new EventHandler(button1_Click);
    > main.Controls.Add(button1); // main is the div
    > }
    >
    > void button1_Click(object sender, EventArgs e)
    > {
    > Button button2 = new Button();
    > button2.ID = "button2";
    > button2.Text = "Button 2";
    > button2.Click += new EventHandler(button2_Click);
    > main.Controls.Add(button2); // main is the div
    > }
    >
    > void button2_Click(object sender, EventArgs e)
    > {
    > // this event handler is never hit.
    > }
    >
    > </script>
    >
    > <html xmlns="http://www.w3.org/1999/xhtml" >
    > <head runat="server">
    > <title>EventHandler Test</title>
    > </head>
    > <body>
    > <form id="form1" runat="server">
    > <div id="main" runat="server"></div>
    > </form>
    > </body>
    > </html>


    Hi,

    As you correctly pointed out, the problem is that during the second
    postback, the additional button/event handlers are not added to the
    page, so no event handlers fire.

    If you have a small number of states through which your page can
    transition, I'd recommend enumerating those, and tracking which state
    your page is in using the viewstate. Then define a routine that
    creates appropriate controls based on which state you're in. Then your
    button clicks become:

    state = newState;
    BuildPageControls();

    and you also call BuildPageControls during any postback (so it'll need
    to be callable multiple times during a single postback, and not end up
    creating duplicate controls)

    That's one approach, if you've got a small number of states. If you've
    got more complex logic, you may end up having to put more into your
    viewstate to allow you to safely reconstruct the page.

    Finally, does Button 1 have to add the new Button 2? Could it not just
    exist on the page but be disabled?

    Damien
    Damien, Feb 22, 2007
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Christian H
    Replies:
    0
    Views:
    286
    Christian H
    Aug 8, 2003
  2. Oleg Ogurok
    Replies:
    0
    Views:
    766
    Oleg Ogurok
    Jan 27, 2005
  3. Replies:
    0
    Views:
    344
  4. Icon Iconoclast
    Replies:
    3
    Views:
    438
    Hans Kesting
    Nov 10, 2008
  5. Mike
    Replies:
    1
    Views:
    116
    Ray Costanzo [MVP]
    Sep 16, 2004
Loading...

Share This Page