Gracias por las ayudas.
Si bien todabia falta estudiar, no termine de comprender todos los conceptos que aparecen en relacion a este tema. Envio este codigo, en el cual a travez de un descriptor de propiedades, se logra poder mostar estas propiedades en la grilla.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.Design;

namespace pru2
{
   /// <summary>
   /// Description of MainForm.
   /// </summary>
   public partial class MainForm : Form
   {
       public MainForm()
       {
           //
// The InitializeComponent() call is required for Windows Forms designer support.
           //
           InitializeComponent();
// // TODO: Add constructor code after the InitializeComponent() call.
           //
           CustomerList cl = new CustomerList();
           Customer c = new Customer();
           Address a = new Address();
           c.Name = "Jorge";
           a.Street = "Arieta";
           c.Address = a;
           cl.Add(c);
           Customer c2 = new Customer();
           Address a2 = new Address();
           c2.Name = "Pedro";
           a2.Street = "Peru";
           cl.Add(c2);
//MessageBox.Show(cl[1].Address.Street.ToString()); dataGridView1.DataSource = cl;
       }
   }
// Descriptor de propiedades de una clase Clientes
       public class CustomerPropertyDescriptor : PropertyDescriptor
       {
           public CustomerPropertyDescriptor(string name) : base(name,
GetPropertyDescriptorAttributes(name)) { }

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

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

           public override object GetValue(object component)
           {
               Customer customer = component as Customer;
               if (customer != null)
               {
                   switch (this.Name)
                   {
                       case "Name":
                           if (customer != null)
                               return customer.Name;
                           break;
                       case "Address.Street":
                           if (customer.Address != null)
                               return customer.Address.Street;
                           break;
                   }
               }
               return null;
           }

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

           public override System.Type PropertyType
           {
               get
               {
                   switch (this.Name)
                   {
                       case "Name":
                           return typeof(string);
                       case "Address.Street":
                           return typeof(Address);
                   }
                   return null;
               }
           }

           public override void ResetValue(object component)
           {
               // empty method
           }

           public override void SetValue(object component, object value)
           {
               Customer customer = component as Customer;
               if (!IsReadOnly && customer != null)
               {
                   switch (this.Name)
                   {
                       case "Name":
                           customer.Name = (string) value;
                           break;
                       case "Address.Street":
                           customer.Address = (Address) value;
                           break;
                   }
               }
           }

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

private static PropertyDescriptor GetPropertyDescriptor(string name)
           {
               foreach (PropertyDescriptor pd in
                        TypeDescriptor.GetProperties(typeof(Customer)))
                   if (pd.Name == name)
                   return pd;

               return null;
           }

private static System.Attribute[] GetPropertyDescriptorAttributes(string name)
           {
               PropertyDescriptor pd = GetPropertyDescriptor(name);

               if (pd == null)
                   return null;

               Attribute[] attributes = new Attribute[pd.Attributes.Count];

               pd.Attributes.CopyTo(attributes, 0);

               return attributes;
           }

       }
   }


   public class CustomerList : BindingList<Customer>, ITypedList
   {
       public CustomerList() : base(new List<Customer>()) { }

       public CustomerList(List<Customer> list) : base(list) { }

       #region ITypedList Members

       PropertyDescriptorCollection
           ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)
       {
List<PropertyDescriptor> descriptors = new List<PropertyDescriptor>();

           descriptors.Add(new pru2.CustomerPropertyDescriptor("Name"));
descriptors.Add(new pru2.CustomerPropertyDescriptor("Address.Street"));

           PropertyDescriptor[] propertyDescriptors = new
               PropertyDescriptor[descriptors.Count];
           descriptors.CopyTo(propertyDescriptors);
           return new PropertyDescriptorCollection(propertyDescriptors);
       }

       string ITypedList.GetListName(PropertyDescriptor[] listAccessors)
       {
           return String.Empty;
       }

       #endregion
   }
public class Customer
   {
       private string name;
       private Address address;
public string Name
       {
           get { return name; }
           set { name = value; }
       }
public Address Address
       {
           get { return address; }
           set { address = value; }
       }
   }

   public class Address
   {
       public string street;
       public string Street
       {
           get { return street; }
           set { street = value; }
       }
   }

Saludos a todos.


Leandro Tuttini escribió:

hola,

lo que quieres implementar es un datagridview con nested class.

te aconsejo le des una mirada a este link:

Nested Property Binding
http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx

te va a aclarar bastante tu duda.

saludos


--- El *jue 25-jun-09, [email protected] /<[email protected]>/* escribió:


    De: [email protected] <[email protected]>
    Asunto: [puntonet] datagrid llenado a traves de colecciones
    Para: [email protected]
    Fecha: jueves, 25 de junio de 2009, 10:27 am

    Buenos dias, estoy probando las colecciones de objectos, en .net.
    Mediante las cuales, creo una coleccion generica en la cual
    almaceno objetos, estos objetos a su vez, tiene otros objetos dentro.
    el problema viene cuando intento visualizar algunas propiedades de
    estos objetos en un datagrid, ya que puedo referir ciertas
    columnas a propiedades del objeto padre, pero no a las propiedades
    de sus hijos.
    Una vez que tengo la coleccion cargada. establezco las columnas
    una por una, pero nose como referir a una propiedad de un objeto
    de otro objeto.

    DataGridViewTextBoxColumn dgridCol = new DataGridViewTextBoxColumn();
    dgridCol.HeaderText = "NOMBRE";
    dgridCol.Name = "NOMBRE";
    dgridCol.Width = 100;
    dgridCol.DataPropertyName = "nombre";
    grilla.Columns.Add(dgridCol);

    probe varias alternativas en la propiedad de la grilla:
    dgridCol.DataPropertyName = "objLocalidad.nombre";

    Pero no encuentro como, alguien sabe como se realiza esto?
    Muchas Gracias.
    Gustavo


------------------------------------------------------------------------

¡Viví la mejor experiencia en la web!
Descargá gratis el nuevo Internet Explorer 8
http://downloads.yahoo.com/ieak8/?l=ar


Responder a