Dynamically adding user controls, and then setting custom properties on those instances?

G

Guest

I have made some user controls with custom properties. I can set those
properties on instances of my user controls, and I have programmed my user
control to do useful visual things in response to how those properties are
set.

I want to be able to do two other things:
a) add User control instances to my page, filling in the place of
placeholder controls, and
b) programmatically setting custom properties on those dynamically spawned
instances of my user controls. At the end of all of this I'm hoping I will
be able to determin the value of those custom properties at runtime as well.

So far I have managed to figure out how to do a), adding UC's to my page and
subbing them in for placeholder controls, as follows:
Control Uwn_ImageBox =
LoadControl("~/App_UserControls/Presentational/Uwn_ImageBox.ascx");
PlaceHolder1.Controls.Add(Uwn_ImageBox);

I have not figured out how to do b). It does not seem like VS.NET has
support for dynamically/programmatically placed UC's loaded via LoadControl,
which is not so surprising. However, I cannot figure out how to add/load
custom properties that I've developed for my UC.

Can some offer some insight here? Is what I'm hoping to do possible?

Thanks,

-KF
 
M

Mark Fitzpatrick

You can do one of two things. You can cast your usercontrol specifically
when you load it. For example: if your control is called MyWeb.MyControl
then you would do the following:

MyWeb.MyControl dynamicControl =
(MyWeb.MyControl)LoadControl("~/MyControl.ascx");

Even though the LoadControl says it returns an object of type Control it
still works because your control is derived from the Control type so is
still seen as a valid control.

The other way is through reflection. Reflection is a lot slower but can get
the job done. To get at the properties you have to use the GetType()
attribute.

First, include the System.Reflection namespace.

PropertyInfo myProp = dynamicControl.GetType().GetProperty("myProperty");

This just holds information about the property. To set the property you
would do the following.

myProp.SetValue(dynamicControl,"myvalue",null);

basically passing the object, and then the value to it. There is a similar
get method to match this.

Something you need to be aware of, sometimes the GetType() won't get the
correct type. Sometimes it will return the type of the page or control, as
in ASCX_SOMETHING, or basically the code that is running in the .ascx or
..aspx page, not the code running in codebhind. If you run into this error
then you get call the GetType() then call the BaseType property like so
dynamicControl.GetType().BaseType
 
G

Guest

Awesome Mark, thank you, this worked very well, and Intellisense still
functions, whihc is impressive. I'm posting my code at message end in case
somebody else follows this thread, and wants a second example. If you don't
mind, I'm hoping you will indulge a few follow up questions.

I'm wondering if it would be possible to use a looping structure to
dynamically generate a user controls, returning a reference to the current
control within the loop, and setting some custom properties on the user
control before looping and generating the next dynamically spawned user
control.

I'm also wondering if or how you could dynamically and uniquely name these
dynamically generated instances. Actionscript is big on this: you generate
dynamic names by concatenating ascending integer values and the like; it's
handy because you can go back later and reference these instances by name.

I am going to want to try to bind my control to a repeater or otherwise
generate a bunch of controls in stacks and rows.

Thank you again for your fast help.

-KF


Functional code:
App_UserControls_Presentational_Uwn_ImageBox Uwn_ImageBoxNew =
(App_UserControls_Presentational_Uwn_ImageBox)LoadControl("~/App_UserControls/Presentational/Uwn_ImageBox.ascx");
PlaceHolder1.Controls.Add(Uwn_ImageBoxNew);
Uwn_ImageBoxNew.Cutline = "hello";
 
W

Walter Wang [MSFT]

Hi KF,

If you're using Repeater and databinding, you can use the UserControl in
the Repeater's ItemTemplate:

<asp:Repeater ID="repeater1" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<uc1:MyControl ID="MyControl1" runat="server"
LabelText='<%# Eval("Name") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>


In the above example, I'm directly binding the Name field to the
UserControl's custom property LabelText.

Let me know if you need further information.


Regards,
Walter Wang ([email protected], 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.
 
G

Guest

Thank you Walter. I will work with this for awhile and see if it does all of
the things I need it to do: it may be sufficient for my needs.

I would be interested at some point if seeing if there is a way that I can
do this in "pure code," without using the structure provided by the
repeater. I am developing content management tools and solutions and the
flexibility may be useful.

If anyone is interested, this link provides a fairly deep look at dynamic
controls in ASP.NET:
http://weblogs.asp.net/infinitieslo...ding-Dynamic-Controls-_2800_Part-2_2900_.aspx

-KF
 
G

Guest

Folks who follow this thread at a later date might be interested in another
comprehensive example of embedding user controls in a repeater.

Recipe 4.5 of Oreilly's ASP.NET Cookbook has a good sample with a lot of
discussion.

You might also wish to check out recipe 4.4, which discusses communication
between user controls.

-KF
 
W

Walter Wang [MSFT]

Hi KF,

As the article pointed out, if the content of your page will be changed by
user, using template control is the way to go.

I'm not sure what do you mean by 'do this in "pure code"'. If you want to
dynamically load multiple instances of the UserControl, just make sure you
have a unique ID for it. In case of Repeater, the RepeaterItem implements
INamingContainer, which is a marker interface that will generate unique ID
for the controls inside it. For more information, please refer
http://msdn2.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx
 

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,755
Messages
2,569,537
Members
45,021
Latest member
AkilahJaim

Latest Threads

Top