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