Controls.Add() for a Web User Control doesn't instansiate its child controls

Discussion in 'ASP .Net' started by Ofer Zelig, Mar 25, 2007.

  1. Ofer Zelig

    Ofer Zelig Guest

    I'll describe the simplest situation of the problem.

    I have a simple Web User Control which only contains a: <div id="bla"
    runat="server" /> .
    I dynamically add it to a page, by performing:

    SomeCtl ctl = new SomeCtl();
    this.Controls.Add(ctl);

    and of course apply a <% @ Register %> tag in order to make SomeCtl known to
    the page (is there some more elegant way?).

    I override OnPreRender of the control, in order to write some stuff to the
    DIV according to some property of the control, but I can't (within the
    event code) access the DIV. It is equal to null.
    The issue happens of course only when my user control (SomeCtl) is added
    dynamically to the page, and not when I place the user control directly
    within the page at design time.


    Thanks in advance for your help,
    Ofer
     
    Ofer Zelig, Mar 25, 2007
    #1
    1. Advertising

  2. Ofer Zelig

    Mark Rae Guest

    "Ofer Zelig" <> wrote in message
    news:...

    > The issue happens of course only when my user control (SomeCtl) is added
    > dynamically to the page, and not when I place the user control directly
    > within the page at design time.


    In which method are you adding the control...?

    If you're doing it in Page_Load, try doing it in Page_Init instead...
     
    Mark Rae, Mar 25, 2007
    #2
    1. Advertising

  3. Ofer Zelig

    Ofer Zelig Guest

    The host of that user control is a control itself (in this case, a
    "regular", design-mode placed one).
    I can't put it in Page_Init of the host control, because the code must
    access properties of the control which are not available in its Page_Load
    event yet...


    "Mark Rae" <> wrote in message
    news:...
    > "Ofer Zelig" <> wrote in message
    > news:...
    >
    > > The issue happens of course only when my user control (SomeCtl) is added
    > > dynamically to the page, and not when I place the user control directly
    > > within the page at design time.

    >
    > In which method are you adding the control...?
    >
    > If you're doing it in Page_Load, try doing it in Page_Init instead...
    >
    >
     
    Ofer Zelig, Mar 25, 2007
    #3
  4. Ofer Zelig

    Mark Rae Guest

    "Ofer Zelig" <> wrote in message
    news:...

    > The host of that user control is a control itself (in this case, a
    > "regular", design-mode placed one).


    OK.

    > I can't put it in Page_Init of the host control, because the code must
    > access properties of the control which are not available in its Page_Load
    > event yet...


    In which case, you might find that you need to rethink your logic here a
    bit, as I'm pretty sure the problem is that the dynamic creation of the
    control is occurring too late in the overall page cycle...

    I've seen this many times with dynamically created controls... Create them
    in Page_Load, they sometimes work... Create them in Page_Init or
    Page_PreInit, they always work...
     
    Mark Rae, Mar 25, 2007
    #4
  5. Ofer Zelig

    Ofer Zelig Guest

    I can't see a way to change it...
    As for the host control (design-time) - as I said, I can't run the
    Controls.Add() at its Page_Init event (or any sooner event of course)
    because the host control won't be able to access its properties. So it must
    run at Page_Load, and in that case - runtime created control's child
    controls are always null.


    "Mark Rae" <> wrote in message
    news:%...
    > "Ofer Zelig" <> wrote in message
    > news:...
    >
    > > The host of that user control is a control itself (in this case, a
    > > "regular", design-mode placed one).

    >
    > OK.
    >
    > > I can't put it in Page_Init of the host control, because the code must
    > > access properties of the control which are not available in its

    Page_Load
    > > event yet...

    >
    > In which case, you might find that you need to rethink your logic here a
    > bit, as I'm pretty sure the problem is that the dynamic creation of the
    > control is occurring too late in the overall page cycle...
    >
    > I've seen this many times with dynamically created controls... Create them
    > in Page_Load, they sometimes work... Create them in Page_Init or
    > Page_PreInit, they always work...
    >
    >
     
    Ofer Zelig, Mar 25, 2007
    #5
  6. Ofer Zelig

    Mark Rae Guest

    "Ofer Zelig" <> wrote in message
    news:...

    > I can't see a way to change it...
    > As for the host control (design-time) - as I said, I can't run the
    > Controls.Add() at its Page_Init event (or any sooner event of course)
    > because the host control won't be able to access its properties. So it
    > must
    > run at Page_Load, and in that case - runtime created control's child
    > controls are always null.


    As I said, I think you'll have to redesign this piece of functionality
    because I don't believe what you're trying to do is possible the way you
    have architected it...
     
    Mark Rae, Mar 25, 2007
    #6
  7. Ofer Zelig

    Ofer Zelig Guest

    I need some more technical answer, specifically why child controls are not
    available when the parent is created at run-time.
    I'll resubmit the question in a new thread, maybe someone can pinpoint the
    issue exactly...

    Thanks!


    "Mark Rae" <> wrote in message
    news:%...
    > "Ofer Zelig" <> wrote in message
    > news:...
    >
    > > I can't see a way to change it...
    > > As for the host control (design-time) - as I said, I can't run the
    > > Controls.Add() at its Page_Init event (or any sooner event of course)
    > > because the host control won't be able to access its properties. So it
    > > must
    > > run at Page_Load, and in that case - runtime created control's child
    > > controls are always null.

    >
    > As I said, I think you'll have to redesign this piece of functionality
    > because I don't believe what you're trying to do is possible the way you
    > have architected it...
    >
    >
     
    Ofer Zelig, Mar 26, 2007
    #7
  8. Hi Ofer,

    I'm not sure if I've fully understood your question, so please feel free to
    correct me:

    1) You have a web user control which need to load another copy of itself
    into its control hierarchy. I think you must have some logic to prevent the
    control from recursively loading infinitely, would you please show the
    logic here?

    2) Normally we use LoadControl to dynamically load a web user control
    instead of using "new":

    #Overview of user controls vs. custom controls
    http://support.microsoft.com/kb/893667


    Sincerely,
    Walter Wang (, remove 'online.')
    Microsoft Online Community Support

    ==================================================
    Get notification to my posts through email? Please refer to
    http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
    ications. If you are using Outlook Express, please make sure you clear the
    check box "Tools/Options/Read: Get 300 headers at a time" to see your reply
    promptly.

    Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
    where an initial response from the community or a Microsoft Support
    Engineer within 1 business day is acceptable. Please note that each follow
    up response may take approximately 2 business days as the support
    professional working with you may need further investigation to reach the
    most efficient resolution. The offering is not appropriate for situations
    that require urgent, real-time or phone-based interactions or complex
    project analysis and dump analysis issues. Issues of this nature are best
    handled working with a dedicated Microsoft Support Engineer by contacting
    Microsoft Customer Support Services (CSS) at
    http://msdn.microsoft.com/subscriptions/support/default.aspx.
    ==================================================

    This posting is provided "AS IS" with no warranties, and confers no rights.
     
    Walter Wang [MSFT], Mar 26, 2007
    #8
  9. Ofer Zelig

    Mark Rae Guest

    "Ofer Zelig" <> wrote in message
    news:%...

    >I need some more technical answer, specifically why child controls are not
    > available when the parent is created at run-time.


    It's to do with the page creation process...

    As I've mentioned (a couple of times now), if dynamic controls are created
    in Page_Load they mostly don't work properly because they are created too
    late to be wired up correctly etc.

    However, if they are created in Page_Init or Page_PreInit, then they pretty
    much always work...

    I appreciate that you find this annoying because of the way you've designed
    things, but there's not much I can do about that...

    Posting the same question again won't get you a different answer...
     
    Mark Rae, Mar 26, 2007
    #9
  10. Ofer Zelig

    Ofer Zelig Guest

    Page_Init or anything similar doens't do the work - I checked.
    About redesign, I can't think of a simpler model, so it would be a problem.
    All that I have, and need, is a regular user control created at design time,
    which in turn creates other user controls at runtime. In that case, as I
    said, the runtime-generated control doesn't have children (simple HTML
    elements), and it seems to me like a bug in the product itself...



    "Mark Rae" <> wrote in message
    news:...
    > "Ofer Zelig" <> wrote in message
    > news:%...
    >
    > >I need some more technical answer, specifically why child controls are

    not
    > > available when the parent is created at run-time.

    >
    > It's to do with the page creation process...
    >
    > As I've mentioned (a couple of times now), if dynamic controls are created
    > in Page_Load they mostly don't work properly because they are created too
    > late to be wired up correctly etc.
    >
    > However, if they are created in Page_Init or Page_PreInit, then they

    pretty
    > much always work...
    >
    > I appreciate that you find this annoying because of the way you've

    designed
    > things, but there's not much I can do about that...
    >
    > Posting the same question again won't get you a different answer...
    >
    >
     
    Ofer Zelig, Mar 26, 2007
    #10
  11. RE: Controls.Add() for a Web User Control doesn't instansiate its chil

    Howdy,

    Web user controls have to be instantiated by calling LoadControl() method of
    the page. Replace
    SomeCtl ctl = new SomeCtl();
    this.Controls.Add(ctl);

    with:

    // make sure path is correct
    SomeCtl ctl = (SomeCtl) LoadControl("SomeControl.ascx");
    this.Controls.Add(ctl);

    Then, calling FindControl() will return valid HtmlGenericControl instance
    representing your div. In addition, if you load controls programatically, you
    don't need to use @Register directive on the page. It's only necessary if you
    use put web user control in aspx code.

    hope this helps
    --
    Milosz


    "Ofer Zelig" wrote:

    > I'll describe the simplest situation of the problem.
    >
    > I have a simple Web User Control which only contains a: <div id="bla"
    > runat="server" /> .
    > I dynamically add it to a page, by performing:
    >
    > SomeCtl ctl = new SomeCtl();
    > this.Controls.Add(ctl);
    >
    > and of course apply a <% @ Register %> tag in order to make SomeCtl known to
    > the page (is there some more elegant way?).
    >
    > I override OnPreRender of the control, in order to write some stuff to the
    > DIV according to some property of the control, but I can't (within the
    > event code) access the DIV. It is equal to null.
    > The issue happens of course only when my user control (SomeCtl) is added
    > dynamically to the page, and not when I place the user control directly
    > within the page at design time.
    >
    >
    > Thanks in advance for your help,
    > Ofer
    >
    >
    >
     
    =?Utf-8?B?TWlsb3N6IFNrYWxlY2tpIFtNQ0FEXQ==?=, Mar 28, 2007
    #11
  12. Ofer Zelig

    Ofer Zelig Guest

    Thanks Milosz & Walter, for your answer.

    LoadControl actually did the job. "new" was the problem.

    But - if I omit <% @ Register %> as Milosz suggested, code like SomeCtl ctl
    = .... won't compile, because the page doesn't know SomeCtl without this
    declaration.
    I can write: Control ctl = LoadControl("SomeControl.ascx");
    but in that case I won't be able to access ctl's members in the code... so
    the only solution as I see would be placing a <% @ Register %> tag, or
    declaring the control at the website level at web.config's <controls>
    section.

    Thanks!


    "Milosz Skalecki [MCAD]" <> wrote in message
    news:...
    > Howdy,
    >
    > Web user controls have to be instantiated by calling LoadControl() method

    of
    > the page. Replace
    > SomeCtl ctl = new SomeCtl();
    > this.Controls.Add(ctl);
    >
    > with:
    >
    > // make sure path is correct
    > SomeCtl ctl = (SomeCtl) LoadControl("SomeControl.ascx");
    > this.Controls.Add(ctl);
    >
    > Then, calling FindControl() will return valid HtmlGenericControl instance
    > representing your div. In addition, if you load controls programatically,

    you
    > don't need to use @Register directive on the page. It's only necessary if

    you
    > use put web user control in aspx code.
    >
    > hope this helps
    > --
    > Milosz
    >
    >
    > "Ofer Zelig" wrote:
    >
    > > I'll describe the simplest situation of the problem.
    > >
    > > I have a simple Web User Control which only contains a: <div id="bla"
    > > runat="server" /> .
    > > I dynamically add it to a page, by performing:
    > >
    > > SomeCtl ctl = new SomeCtl();
    > > this.Controls.Add(ctl);
    > >
    > > and of course apply a <% @ Register %> tag in order to make SomeCtl

    known to
    > > the page (is there some more elegant way?).
    > >
    > > I override OnPreRender of the control, in order to write some stuff to

    the
    > > DIV according to some property of the control, but I can't (within the
    > > event code) access the DIV. It is equal to null.
    > > The issue happens of course only when my user control (SomeCtl) is added
    > > dynamically to the page, and not when I place the user control directly
    > > within the page at design time.
    > >
    > >
    > > Thanks in advance for your help,
    > > Ofer
    > >
    > >
    > >
     
    Ofer Zelig, Mar 28, 2007
    #12
  13. Hi Ofer,

    Thanks for the update.

    Yes LoadControl only returns a Control reference, to use the strong-typed
    reference to the actual user control class, you will need to cast it and
    you will need to import the namespace of the user control class.

    To import the namespace, you will have two approaches: the first one is
    doing it like what we do it in C#: put a using in your code. The second one
    is yours: <% @ Regiser %> will help you import the namespace.

    Actually there's third approach: use full qualified name of the user
    control class.

    Regards,
    Walter Wang (, remove 'online.')
    Microsoft Online Community Support

    ==================================================
    When responding to posts, please "Reply to Group" via your newsreader so
    that others may learn and benefit from your issue.
    ==================================================

    This posting is provided "AS IS" with no warranties, and confers no rights.
     
    Walter Wang [MSFT], Mar 28, 2007
    #13
  14. Ofer Zelig

    Ofer Zelig Guest

    Thank you for your detailed answer!



    "Walter Wang [MSFT]" <> wrote in message
    news:...
    > Hi Ofer,
    >
    > Thanks for the update.
    >
    > Yes LoadControl only returns a Control reference, to use the strong-typed
    > reference to the actual user control class, you will need to cast it and
    > you will need to import the namespace of the user control class.
    >
    > To import the namespace, you will have two approaches: the first one is
    > doing it like what we do it in C#: put a using in your code. The second

    one
    > is yours: <% @ Regiser %> will help you import the namespace.
    >
    > Actually there's third approach: use full qualified name of the user
    > control class.
    >
    > Regards,
    > Walter Wang (, remove 'online.')
    > Microsoft Online Community Support
    >
    > ==================================================
    > When responding to posts, please "Reply to Group" via your newsreader so
    > that others may learn and benefit from your issue.
    > ==================================================
    >
    > This posting is provided "AS IS" with no warranties, and confers no

    rights.
    >
     
    Ofer Zelig, Mar 28, 2007
    #14
  15. Ofer Zelig

    Ofer Zelig Guest

    Hello Mark,

    A new thread has actually made it. The solution is to load the control by
    LoadControl rather by SomeCtl ctl = new SomeCtl().
    Thanks anyway!!

    Ofer


    "Mark Rae" <> wrote in message
    news:...
    > "Ofer Zelig" <> wrote in message
    > news:%...
    >
    > >I need some more technical answer, specifically why child controls are

    not
    > > available when the parent is created at run-time.

    >
    > It's to do with the page creation process...
    >
    > As I've mentioned (a couple of times now), if dynamic controls are created
    > in Page_Load they mostly don't work properly because they are created too
    > late to be wired up correctly etc.
    >
    > However, if they are created in Page_Init or Page_PreInit, then they

    pretty
    > much always work...
    >
    > I appreciate that you find this annoying because of the way you've

    designed
    > things, but there's not much I can do about that...
    >
    > Posting the same question again won't get you a different answer...
    >
    >
     
    Ofer Zelig, Mar 28, 2007
    #15
  16. Ofer Zelig

    Mark Rae Guest

    "Ofer Zelig" <> wrote in message
    news:%...

    > A new thread has actually made it. The solution is to load the control by
    > LoadControl rather by SomeCtl ctl = new SomeCtl().


    Excellent!
     
    Mark Rae, Mar 28, 2007
    #16
    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. Jeff Rodriguez
    Replies:
    23
    Views:
    1,141
    David Schwartz
    Dec 9, 2003
  2. Ofer Zelig
    Replies:
    3
    Views:
    757
    Walter Wang [MSFT]
    Mar 28, 2007
  3. Chad Scharf
    Replies:
    3
    Views:
    904
    Chad Scharf
    Oct 18, 2007
  4. Replies:
    0
    Views:
    202
  5. thunk
    Replies:
    1
    Views:
    323
    thunk
    Mar 30, 2010
Loading...

Share This Page