Luis,

You want to bind a column in the grid to "T" property of "B", right?
It's possible using custom ITypedList implementation and a class
derived from PropertyDescriptor. I wrote a sample for you. It binds
one column of the grid to "Foo.Name" and the second -- to
"Foo.Bar.Name". It's fully working, have a look.

Using this approach you can "extend" your basic object with whatever
bindable properties you might need. I use it for example to
concatenate FirstName and LastName properties of my business object
into single /editable/ Full Name column of the data grid, or to
concatenate PhoneNumbers child collection into comma separated list of
 values.

The objects must be in a collection though, and you mentioned the
array. If you must use the array then you'll need to write a wrapper
which implements IList in addition to ITypedList.

Disclaimer: The project I'm using it in hasn't reached production
stage yet and therefore I can't say it's well tested...

Alexander

=============================================


using System;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace GridCustomBinding
{

        public class AppStart
        {
                [STAThread]
                static void Main()
                {
                        DataGrid g = new DataGrid();

                        DataGridTableStyle t = new DataGridTableStyle();
                        t.MappingName = "Foo";
                        
                        DataGridColumnStyle name = new DataGridTextBoxColumn();
                        name.MappingName = "Name";

                        t.GridColumnStyles.Add(name);

                        DataGridColumnStyle barName = new DataGridTextBoxColumn();
                        barName.MappingName = "Bar.Name";

                        t.GridColumnStyles.Add(barName);

                        g.TableStyles.Add(t);

                        
                        g.DataSource = BindableCollection.GetSampleData();

                        g.Dock = DockStyle.Fill;

                        Form f = new Form();

                        f.Controls.Add(g);

                        Application.Run(f);

                }
        }

        public class BindableCollection : CollectionBase, ITypedList
        {
                public static BindableCollection GetSampleData()
                {
                        BindableCollection col = new BindableCollection();
                        col.List.Add(new Foo());
                        col.List.Add(new Foo());

                        PropertyDescriptor extraProp = new FooBarPropDescriptor();
                        col.PropertyDescriptors.Add(extraProp);

                        return col;
                }

                #region ITypedList Members

                private PropertyDescriptorCollection _props = null;

                public PropertyDescriptorCollection PropertyDescriptors
                {
                        get
                        {
                                if (_props == null) 
                                {
                                        // Collection returned from GetProperties 
doesn't allow adding new elements
                                        _props = new 
PropertyDescriptorCollection(null);
                                        foreach (PropertyDescriptor prop in
TypeDescriptor.GetProperties(typeof(Foo)))
                                        {
                                                _props.Add(prop);
                                        }
                                }
                                return _props;
                        }
                }

                public PropertyDescriptorCollection
GetItemProperties(PropertyDescriptor[] listAccessors)
                {
                        return PropertyDescriptors;
                }

                public string GetListName(PropertyDescriptor[] listAccessors)
                {
                        // DataGrid uses this as MappingName
                        return "Foo";
                }

                #endregion
        }

        public class FooBarPropDescriptor : PropertyDescriptor
        {
                // The parameter in base constructor is the 
                // string you're going to use as MappingName property
                // of a grid column
                public FooBarPropDescriptor() : base("Bar.Name", null)
                {}

                public override object GetValue(object component)
                {
                        Foo obj = (Foo) component;
                        return obj.Child.Name;
                }

                public override void SetValue(object component, object value)
                {
                        Foo obj = (Foo) component;
                        obj.Child.Name = (string) value;
                }

                public override bool CanResetValue(object component)
                {
                        return false;
                }

                public override void ResetValue(object component)
                {

                }

                public override bool ShouldSerializeValue(object component)
                {
                        return false;
                }

                public override bool IsReadOnly
                {
                        get
                        {
                                return false;
                        }
                }

                public override Type ComponentType
                {
                        get
                        {
                                return typeof(Foo);
                        }
                }

                public override Type PropertyType
                {
                        get
                        {
                                return typeof(string);
                        }
                }


        }

        public class Foo
        {
                public string Name
                {
                        get
                        {
                                return "Foo object";
                        }
                }

                private Bar _child = new Bar();

                public Bar Child
                {
                        get
                        {
                                return _child;
                        }
                }

        }

        public class Bar
        {

                private string _name = "Bar object";

                public string Name
                {
                        get
                        {
                                return _name;
                        }
                        set
                        {
                                _name = value;
                        }
                }
        }
}



On Tue, 28 Sep 2004 18:21:10 +0100, Luis Abreu <[EMAIL PROTECTED]> wrote:
> Hello.
> 
> ok, suppose you have class A, which has a property named classb of
> type ClassB. ClassB also has a property named T.
> 
> class A
> {
>     public ClassB classB {...}
> }
> 
> class B
> {
>   public string T;
> }
> 
> Now let's suppose that I have an array or a collection of elements of
> type A. Is there a way for me to bind the subproperty B to a datagrid
> column by using the MappingName property of the datagridtextboxcolumn?
> 
> thanks
> --
> Regards,
> Luis Abreu
> email: labreu_at_gmail.com
> http://weblogs.pontonetpt.com/luisabreu
> http://www.pontonetpt.com
> http://weblogs.pontonetpt.com/
> 
> ===================================
> This list is hosted by DevelopMentorŪ  http://www.develop.com
> Some .NET courses you may be interested in:
> 
> Essential .NET: building applications and components with CSharp
> August 30 - September 3, in Los Angeles
> http://www.develop.com/courses/edotnet
> 
> View archives and manage your subscription(s) at http://discuss.develop.com
>

===================================
This list is hosted by DevelopMentorŪ  http://www.develop.com
Some .NET courses you may be interested in:

Essential .NET: building applications and components with CSharp
August 30 - September 3, in Los Angeles
http://www.develop.com/courses/edotnet

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to