DotNetNewsgroup.com  
web access to complete list of Microsoft.NET newsgroups
   home   |   control panel login   |   archive  |  
 
  carried group
academic
adonet
aspnet
aspnet.announcements
aspnet.buildingcontrols
aspnet.caching
aspnet.datagridcontrol
aspnet.mobile
aspnet.security
aspnet.webcontrols
aspnet.webservices
assignment_manager
datatools
dotnet.distributed_apps
dotnet.general
dotnet.myservices
dotnet.nternationalization
dotnet.scripting
dotnet.security
dotnet.vjsharp
dotnet.vsa
dotnet.xml
dotnetfaqs
framework
framework.clr
framework.compactframework
framework.component_services
framework.controls
framework.databinding
framework.drawing
framework.enhancements
framework.interop
framework.odbcnet
framework.performance
framework.remoting
framework.sdk
framework.setup
framework.webservices
framework.windowsforms
framework.wmi
frwk.windowsforms.designtime
lang.csharp
lang.jscript
lang.vb
lang.vb.controls
lang.vb.data
lang.vb.upgrade
lang.vc
lang.vc.libraries
  
 
start date: Mon, 20 Aug 2007 13:36:01 -0700,    posted on: microsoft.public.dotnet.framework        back       

Thread Index
  1    Tim Pacl
          2    Tim Pacl


PropertyInfo.SetValue on new ObjectCollect   
I have a Windows Forms designer that writes the created form (with controls) 
as Xml/Xaml. Alternately it reads Xml/Xaml to create form controls in the 
designer form. I am trying to do this using reflection. I can use 
Activator.CreateInstance to create the controls and can set most of the 
properties using just a little bit of code:

info.SetValue(temp, 
TypeDescriptor.GetConverter(info.PropertyType).ConvertFrom(val), null);
where info is the PropertyInfo for the control property that will be set, 
temp is the control, and val is the string representation of the value.

This breaks for some properties like font and the Items collection for some 
controls. It is the latter that I am looking for help with.

The problem is that when I create the new control using CreateInstance the 
control is returned with an empty Items collection. To further complicate the 
matter, the instance is returned as an object. I could simply determine the 
control type and use a switch statement to add each Item to the collection. 
That can lead to alot of code and a lot of maintenance. My goal is to 
populate the Items collection generically using reflection as I am already 
doing for most of the properties.

I can use CreateInstance to create an value object but since the control is 
cast as an object, it does not reveal the Items collection and I can 
therefore not add the new value object.

Does anyone know how to populate the Items collection of a control using 
reflection?
Date:Mon, 20 Aug 2007 13:36:01 -0700   Author:  

RE: PropertyInfo.SetValue on new ObjectCollect   
Well I figured out the answer myself. It was far simpler than I was making it 
out. The solution is 3 lines of code:

                    object obj = info.GetValue(temp, null);
                    MethodInfo add = info.PropertyType.GetMethod("Add");
                    add.Invoke(obj, new object[] { val });

I just needed to get the Add method and invoke it.

So now I am working on the second part mentioned below: Font. Not quite so 
simple there. I have looked at the available Font Constructors and it looks 
like I can set the font by creating a new font using one of the constructors. 
It will be a pain to manually write the Font property value with each of the 
subproperty values in the correct sequence. It will be even worse taking the 
comma delimited string and parsing each member to the correct type to be 
rebuilt.

Does anyone know an easier way?

"Tim Pacl" wrote:


> I have a Windows Forms designer that writes the created form (with controls) 
> as Xml/Xaml. Alternately it reads Xml/Xaml to create form controls in the 
> designer form. I am trying to do this using reflection. I can use 
> Activator.CreateInstance to create the controls and can set most of the 
> properties using just a little bit of code:
> 
> info.SetValue(temp, 
> TypeDescriptor.GetConverter(info.PropertyType).ConvertFrom(val), null);
> where info is the PropertyInfo for the control property that will be set, 
> temp is the control, and val is the string representation of the value.
> 
> This breaks for some properties like font and the Items collection for some 
> controls. It is the latter that I am looking for help with.
> 
> The problem is that when I create the new control using CreateInstance the 
> control is returned with an empty Items collection. To further complicate the 
> matter, the instance is returned as an object. I could simply determine the 
> control type and use a switch statement to add each Item to the collection. 
> That can lead to alot of code and a lot of maintenance. My goal is to 
> populate the Items collection generically using reflection as I am already 
> doing for most of the properties.
> 
> I can use CreateInstance to create an value object but since the control is 
> cast as an object, it does not reveal the Items collection and I can 
> therefore not add the new value object.
> 
> Does anyone know how to populate the Items collection of a control using 
> reflection?
Date:Wed, 22 Aug 2007 12:50:03 -0700   Author:  

Google
 
Web dotnetnewsgroup.com


COPYRIGHT ?2005, EUROFRONT WORLDWIDE LTD., ALL RIGHT RESERVE  |   Contact us