Dynamically create non-fixed number of TextBoxes in Composite Control

P

Paul

Hi,

I have a composite control(TextBoxControl.cs) in my
DynamicTextBox.aspx. On the Page_Load of the
DynamicTextBox.aspx page, I am calling a business tier
assembly, which is returning an ArrayList containing an
unknown amount of objects. I would like to pass this
ArrayList to my composite control and for each object in
the ArrayList, I would like to build and populate a
TextBox. The reason I need to pass the data to the
composite control is because I would like to reuse this
control on multiple pages in the application.

Currently, I am able to get the data from the business
tier assembly directly from the composite control's
CreateChildControls() method, and create the Textboxes.
The problem I am having is passing the data from the
Page_Load event of the parent DynamicTextBox.aspx and
having the controls show up on the page. The data gets to
the control's CreateChildControls() event and I watch it
in Debug go through and create the controls, but when the
page renders, the controls are not there. What gives? I
tried passing the data from the DynamicTextBox.aspx
page's On_Init, but the same result as Page_Load occured.

Does anyone know why the TextBoxes are not rendering or
have any insight as to what I am doing wrong?



Thanks in advance for your time and help,

Paul
 
J

John Saunders

Paul said:
Hi,

Does anyone know why the TextBoxes are not rendering or
have any insight as to what I am doing wrong?

Paul, I suggest you read up on creating DataBound controls. "Developing
Microsoft® ASP.NET Server Controls and Components" from MS Press, by Nikhil
Kothari and Vandana Datye (http://www.microsoft.com/mspress/books/5728.asp)
is the best book I've seen on the subject.
Thanks in advance for your time and help,

I've never created a data bound control, but from what I recall reading, you
don't want to create the controls in CreateChildControls, but rather in
DataBind. Also, you'll want to be able to recreate the controls from
ViewState in CreateChildControls. The book above recommends having a common
control-creation method called both by DataBind and by CreateChildControls -
they call theirs CreateControlHierarchy, and it takes a bool to tell it
whether to use the data source or to use ViewState.
 
P

Paul

Thanks John. I reviewed the book you recommended and
will order it.

I am still unclear how to pass data to the control before
the textboxes are rendered. Unfortunately our deadline
is such that I can't take the gamble of thinking I can
figure it out using the book. If I can't find an answer,
I will have to move to code directly into the page as
opposed to using a control. Even then I am unsure if
that will work.

Thanks for your help. Anyone have any ideas?



Thanks,

Paul
 
P

Paul

I am unable to do this because the properties don't exist
at the time CreateChildControls() runs. I set the
properties during the Page_Load of the parent.

Is this an example of a time when I would need to use a
superclassed control? I have never wrote one, but I am
reading on them now. Still unclear how to resolve this
issue.

Thanks,

Paul
 
J

John Saunders

Paul said:
I am unable to do this because the properties don't exist
at the time CreateChildControls() runs. I set the
properties during the Page_Load of the parent.

Is this an example of a time when I would need to use a
superclassed control? I have never wrote one, but I am
reading on them now. Still unclear how to resolve this
issue.

Why is CreateChildControls running before Page_Load? That's almost certainly
wrong.

I had a control doing something like that due to EnsureChildControls calls
at the wrong times. Removing them fixed the control.
 
P

Paul

Sorry for the confusion, I was referring to Page_Load of
the parent page which contains the control. If you
follow through a debug, you can see the path.

I found a fix!!! I was reading a book from Jeff Prosise
called "Programming Microsoft .NET" and saw the light.
On page 338 he explains how to dynamically load controls
onto the page. I set asp:placeholders on the page where
I want my control to be rendered, then did this in my
code behind of the parent page:

ArrayList myList = PJObject2.GetPJData();
TestControl myTestControl = (TestControl) LoadControl
("TestControl.ascx");
myTestControl.myList = myList;
myTestControl.isPJObject2 = true;
myTestControlPlaceHolder.Controls.Add(myTestControl);

In the control, TestControl.ascx, I was able to access
the properties "myList" and "isPJObject2" in
the "CreateChildControls" method.

Thanks for the help,

Paul
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top