dynamically adding user controls

Discussion in 'ASP .Net Building Controls' started by Dune, Sep 26, 2003.

  1. Dune

    Dune Guest

    I have a web form that has a button called "Add Blank Row".
    Every time this button is pressed a new "blank row" user
    control should be added to the web form. This is done
    dynamically in the button's event handler by calling
    Page.LoadControl(). Everything works ok except that the
    web form can't seem to remember the user controls that are
    added.

    The moment a postback occurs, any user controls that exist
    disappear.

    With some googling, I found a page which said "you must
    load dynamically created controls on EVERY postback".

    Is this true?And if so, could someone please explain why
    and how to work around it?

    (I assume it would require keeping track of the user
    controls as they are added but I can't think of a
    efficient way to go about doing this)


    Cheers, Dune
    Dune, Sep 26, 2003
    #1
    1. Advertising

  2. "Dune" <> wrote in message
    news:024201c383e7$e651a420$...
    > I have a web form that has a button called "Add Blank Row".
    > Every time this button is pressed a new "blank row" user
    > control should be added to the web form. This is done
    > dynamically in the button's event handler by calling
    > Page.LoadControl(). Everything works ok except that the
    > web form can't seem to remember the user controls that are
    > added.
    >
    > The moment a postback occurs, any user controls that exist
    > disappear.
    >
    > With some googling, I found a page which said "you must
    > load dynamically created controls on EVERY postback".
    >
    > Is this true?And if so, could someone please explain why
    > and how to work around it?


    This is true, and not just for user controls. It's true for all controls.

    Each request, whether an initial request (GET) or a postback (POST) creates
    a new instance of your page class. This instance has no relationship to the
    instance created on the previous request, nor is there a relationship
    between the instance created for the initial request and the one created on
    PostBack. In particular, controls you added on the initial request will not
    exist in the instance created on PostBack - unless you create them.

    Now, if ViewState is enabled, once you create the controls and add them to
    their parent's Controls collection, the controls will load their own
    ViewState. However, this requires that the controls be created in the same
    order each time.

    > (I assume it would require keeping track of the user
    > controls as they are added but I can't think of a
    > efficient way to go about doing this)


    Actually, ViewState is a good way to do this. On the initial request, when
    you decide how many rows you'll have the first time around, set
    ViewState["TableRows"] to the number of rows. On PostBack, you can read
    ViewState["TableRows"] to find out how many rows you'll need to create. In
    the Click event handler for your "New Row" button, you can add the new row
    and increment ViewState["TableRows"]. On the next PostBack, you'll read
    ViewState["TableRows"] to find out how many rows you'll need to create...
    --
    John Saunders
    Internet Engineer
    John Saunders, Sep 26, 2003
    #2
    1. Advertising

  3. Dune

    Dune Guest

    thanks :)

    got it all working now


    >-----Original Message-----
    >"Dune" <> wrote in message
    >news:024201c383e7$e651a420$...
    >> I have a web form that has a button called "Add Blank

    Row".
    >> Every time this button is pressed a new "blank row" user
    >> control should be added to the web form. This is done
    >> dynamically in the button's event handler by calling
    >> Page.LoadControl(). Everything works ok except that the
    >> web form can't seem to remember the user controls that

    are
    >> added.
    >>
    >> The moment a postback occurs, any user controls that

    exist
    >> disappear.
    >>
    >> With some googling, I found a page which said "you must
    >> load dynamically created controls on EVERY postback".
    >>
    >> Is this true?And if so, could someone please explain why
    >> and how to work around it?

    >
    >This is true, and not just for user controls. It's true

    for all controls.
    >
    >Each request, whether an initial request (GET) or a

    postback (POST) creates
    >a new instance of your page class. This instance has no

    relationship to the
    >instance created on the previous request, nor is there a

    relationship
    >between the instance created for the initial request and

    the one created on
    >PostBack. In particular, controls you added on the

    initial request will not
    >exist in the instance created on PostBack - unless you

    create them.
    >
    >Now, if ViewState is enabled, once you create the

    controls and add them to
    >their parent's Controls collection, the controls will

    load their own
    >ViewState. However, this requires that the controls be

    created in the same
    >order each time.
    >
    >> (I assume it would require keeping track of the user
    >> controls as they are added but I can't think of a
    >> efficient way to go about doing this)

    >
    >Actually, ViewState is a good way to do this. On the

    initial request, when
    >you decide how many rows you'll have the first time

    around, set
    >ViewState["TableRows"] to the number of rows. On

    PostBack, you can read
    >ViewState["TableRows"] to find out how many rows you'll

    need to create. In
    >the Click event handler for your "New Row" button, you

    can add the new row
    >and increment ViewState["TableRows"]. On the next

    PostBack, you'll read
    >ViewState["TableRows"] to find out how many rows you'll

    need to create...
    >--
    >John Saunders
    >Internet Engineer
    >
    >
    >
    >.
    >
    Dune, Sep 28, 2003
    #3
  4. Hi John,

    I've couple of questions with respect to adding
    WebControls to a page.

    I've written a WebControl that encapsulates an client-side
    ActiveX control. Now, I want to add multiple instances of
    this control to my page.

    If I statically bind it with


    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
    AutoEventWireup="false"
    Inherits="ControlLifeCycle.WebForm1" %>
    <%@ Register TagPrefix="dial"
    Namespace="BroadVu.Util.Widgets" Assembly="Dial" %>
    <HTML>
    <HEAD>
    <title>WebForm1</title>
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post"
    runat="server">
    <Dial:dial id="addedDial"
    runat="server"></Dial:dial>
    </form>
    </body>
    </HTML>

    it works fine. The output HTML is rendered properly
    within the <form> tag.

    Issue #1
    --------
    I'm using Page.RegisterClientScript &
    Page.RegisterStartupScript methods inside my WebControl to
    emit some JavaScript. They are NOT getting emitted.
    Though if I have a custom Render(Page page) method, the
    scripts get emitted!

    Issue #2
    --------
    If I add control this way:

    Dial dial = new Dial(xml);
    this.Controls.Add(dial);

    the HTML rendered through Render(HtmlWriter) outputs
    OUTSIDE the <html> tag!


    <HTML>
    </HTML>
    <table id="K000004" border="1" style="border:1px solid
    #C9E7FA;">
    <!--HTML content written by the control out goes here! -->
    </table>


    Any help in this regard would be deeply appreciated.
    Please help.


    Regards,


    Vyas






    >-----Original Message-----
    >"Dune" <> wrote in message
    >news:024201c383e7$e651a420$...
    >> I have a web form that has a button called "Add Blank

    Row".
    >> Every time this button is pressed a new "blank row" user
    >> control should be added to the web form. This is done
    >> dynamically in the button's event handler by calling
    >> Page.LoadControl(). Everything works ok except that the
    >> web form can't seem to remember the user controls that

    are
    >> added.
    >>
    >> The moment a postback occurs, any user controls that

    exist
    >> disappear.
    >>
    >> With some googling, I found a page which said "you must
    >> load dynamically created controls on EVERY postback".
    >>
    >> Is this true?And if so, could someone please explain why
    >> and how to work around it?

    >
    >This is true, and not just for user controls. It's true

    for all controls.
    >
    >Each request, whether an initial request (GET) or a

    postback (POST) creates
    >a new instance of your page class. This instance has no

    relationship to the
    >instance created on the previous request, nor is there a

    relationship
    >between the instance created for the initial request and

    the one created on
    >PostBack. In particular, controls you added on the

    initial request will not
    >exist in the instance created on PostBack - unless you

    create them.
    >
    >Now, if ViewState is enabled, once you create the

    controls and add them to
    >their parent's Controls collection, the controls will

    load their own
    >ViewState. However, this requires that the controls be

    created in the same
    >order each time.
    >
    >> (I assume it would require keeping track of the user
    >> controls as they are added but I can't think of a
    >> efficient way to go about doing this)

    >
    >Actually, ViewState is a good way to do this. On the

    initial request, when
    >you decide how many rows you'll have the first time

    around, set
    >ViewState["TableRows"] to the number of rows. On

    PostBack, you can read
    >ViewState["TableRows"] to find out how many rows you'll

    need to create. In
    >the Click event handler for your "New Row" button, you

    can add the new row
    >and increment ViewState["TableRows"]. On the next

    PostBack, you'll read
    >ViewState["TableRows"] to find out how many rows you'll

    need to create...
    >--
    >John Saunders
    >Internet Engineer
    >
    >
    >
    >.
    >
    Vyas Bharghava, Sep 30, 2003
    #4
  5. "Vyas Bharghava" <> wrote in message
    news:19ed901c38770$9a31d5b0$...
    > Hi John,
    >

    ....
    > Issue #1
    > --------
    > I'm using Page.RegisterClientScript &
    > Page.RegisterStartupScript methods inside my WebControl to
    > emit some JavaScript. They are NOT getting emitted.
    > Though if I have a custom Render(Page page) method, the
    > scripts get emitted!


    I don't know of any method with the signature "void Render(Page)". What is
    this method?

    And,in your "protected override void Render(HtmlTextWriter writer)" method,
    are you calling base.Render(writer)"?


    > Issue #2
    > --------
    > If I add control this way:
    >
    > Dial dial = new Dial(xml);
    > this.Controls.Add(dial);
    >
    > the HTML rendered through Render(HtmlWriter) outputs
    > OUTSIDE the <html> tag!


    In the above, what was "this"?

    > <HTML>
    > </HTML>
    > <table id="K000004" border="1" style="border:1px solid
    > #C9E7FA;">
    > <!--HTML content written by the control out goes here! -->
    > </table>



    There's something very strange about the way that rendering is working in
    your case. Please make sure that all of your overloads are calling their
    base class versions. If there's still a problem after that, please let us
    know more about what events your code is running in.
    --
    John Saunders
    Internet Engineer
    John Saunders, Oct 1, 2003
    #5
  6. > Issue #1
    > --------
    > I'm using Page.RegisterClientScript &
    > Page.RegisterStartupScript methods inside my WebControl to
    > emit some JavaScript. They are NOT getting emitted.
    > Though if I have a custom Render(Page page) method, the
    > scripts get emitted!


    >>I don't know of any method with the signature "void Render
    >>(Page)". What is
    >>this method?


    This is a method written by me.
    If I pass the page object from the ASPX page in the onload event:

    Dial dial = new Dial();
    dial.Render(this);

    Inside this Render I access the underlying response stream thus:

    public void Render(Page page)
    {
    page.Response.Write("Hi there!");
    }

    >>And,in your "protected override void Render
    >>(HtmlTextWriter writer)" method,
    >>are you calling base.Render(writer)"?


    I wasn't... I'll try this.


    > Issue #2
    > --------
    > If I add control this way:
    >
    > Dial dial = new Dial(xml);
    > this.Controls.Add(dial);
    >
    > the HTML rendered through Render(HtmlWriter) outputs
    > OUTSIDE the <html> tag!


    >>In the above, what was "this"?


    It's the page object. I'm adding the control to the controls collection
    of the page.

    Thanks.

    Vyas

    *** Sent via Developersdex http://www.developersdex.com ***
    Don't just participate in USENET...get rewarded for it!
    Vyas Bharghava, Oct 1, 2003
    #6
  7. "Vyas Bharghava" <> wrote in message
    news:%...
    > > Issue #1
    > > --------
    > > I'm using Page.RegisterClientScript &
    > > Page.RegisterStartupScript methods inside my WebControl to
    > > emit some JavaScript. They are NOT getting emitted.
    > > Though if I have a custom Render(Page page) method, the
    > > scripts get emitted!

    >
    > >>I don't know of any method with the signature "void Render
    > >>(Page)". What is
    > >>this method?

    >
    > This is a method written by me.
    > If I pass the page object from the ASPX page in the onload event:
    >
    > Dial dial = new Dial();
    > dial.Render(this);
    >
    > Inside this Render I access the underlying response stream thus:
    >
    > public void Render(Page page)
    > {
    > page.Response.Write("Hi there!");
    > }
    >
    > >>And,in your "protected override void Render
    > >>(HtmlTextWriter writer)" method,
    > >>are you calling base.Render(writer)"?

    >
    > I wasn't... I'll try this.
    >
    >
    > > Issue #2
    > > --------
    > > If I add control this way:
    > >
    > > Dial dial = new Dial(xml);
    > > this.Controls.Add(dial);
    > >
    > > the HTML rendered through Render(HtmlWriter) outputs
    > > OUTSIDE the <html> tag!

    >
    > >>In the above, what was "this"?

    >
    > It's the page object. I'm adding the control to the controls collection
    > of the page.


    This is your problem. The Page object is not the HtmlForm. If you look at
    Page.Controls, you'll find it contains an HtmlForm control. You need to add
    your controls to the HtmlForm's Controls collection.
    --
    John Saunders
    Internet Engineer
    John Saunders, Oct 3, 2003
    #7
    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. MC D
    Replies:
    4
    Views:
    454
    Big D
    Nov 18, 2003
  2. Jason
    Replies:
    7
    Views:
    1,197
    Rajesh CKR
    May 4, 2006
  3. tshad
    Replies:
    2
    Views:
    439
    tshad
    Jul 27, 2006
  4. Guest
    Replies:
    6
    Views:
    370
    Walter Wang [MSFT]
    Dec 23, 2006
  5. Justin Dutoit
    Replies:
    0
    Views:
    345
    Justin Dutoit
    Mar 19, 2008
Loading...

Share This Page