Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > ASP .Net > ASP .Net Building Controls > dynamically adding user controls

Reply
Thread Tools

dynamically adding user controls

 
 
Dune
Guest
Posts: n/a
 
      09-26-2003
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
 
Reply With Quote
 
 
 
 
John Saunders
Guest
Posts: n/a
 
      09-26-2003
"Dune" <(E-Mail Removed)> wrote in message
news:024201c383e7$e651a420$(E-Mail Removed)...
> 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
http://www.velocityreviews.com/forums/(E-Mail Removed)


 
Reply With Quote
 
 
 
 
Dune
Guest
Posts: n/a
 
      09-28-2003
thanks

got it all working now


>-----Original Message-----
>"Dune" <(E-Mail Removed)> wrote in message
>news:024201c383e7$e651a420$(E-Mail Removed)...
>> 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
>(E-Mail Removed)
>
>
>.
>

 
Reply With Quote
 
Vyas Bharghava
Guest
Posts: n/a
 
      09-30-2003
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" <(E-Mail Removed)> wrote in message
>news:024201c383e7$e651a420$(E-Mail Removed)...
>> 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
>(E-Mail Removed)
>
>
>.
>

 
Reply With Quote
 
John Saunders
Guest
Posts: n/a
 
      09-30-2003
"Vyas Bharghava" <(E-Mail Removed)> wrote in message
news:19ed901c38770$9a31d5b0$(E-Mail Removed)...
> 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
(E-Mail Removed)


 
Reply With Quote
 
Vyas Bharghava
Guest
Posts: n/a
 
      10-01-2003
> 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!
 
Reply With Quote
 
John Saunders
Guest
Posts: n/a
 
      10-03-2003
"Vyas Bharghava" <(E-Mail Removed)> wrote in message
news:%(E-Mail Removed)...
> > 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
(E-Mail Removed)


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Tough Q on Dynamically adding cached User Controls Justin Dutoit ASP .Net 0 03-19-2008 12:46 AM
Dynamically adding user controls, and then setting custom properties on those instances? ASP .Net 6 12-23-2006 09:12 AM
Dynamically adding in User Controls tshad ASP .Net 2 07-27-2006 06:19 PM
Dynamically adding Web User Controls to ASP page Jason ASP .Net 7 05-04-2006 07:27 PM
Efficiency of dynamically adding web user controls MC D ASP .Net 4 11-18-2003 07:27 PM



Advertisments