Enlace genérico de la colección de la Lista de<> a la propiedad de la cuadrícula

Intento de unión colección genérica listContact a propGrid pero de salida no coincide con lo que yo esperaba. Quiero listContact se muestra como ListBox en propGrid. ¿Cómo lo hago? Gracias.

class Contact
{
    public string Name { get; set; }
    public string Address { get; set; }
}

PropertyGrid propGrid = new PropertyGrid();
List<Contact> listContact   = new List<Contact>();

private void Form1_Load(object sender, EventArgs e)
{
    listContact.Clear();
    Contact newContact = null;

    newContact = new Contact();
    newContact.Name = "diana";
    newContact.Address = "en";
    listContact.Add(newContact);

    newContact = null;
    newContact = new Contact();
    newContact.Name = "maxim";
    newContact.Address = "cand";
    listContact.Add(newContact);

    propGrid.SelectedObject = listContact;
    this.Controls.Add(propGrid);
    propGrid.Dock = DockStyle.Fill;

}
InformationsquelleAutor new bie | 2012-12-11

1 Kommentar

  1. 5

    Usted tiene que extender de la clase a utilizar ExpandableObjectConverter. Esto hace que el parseable suceder.

    Ver el código de abajo. Sólo cayó ejemplos. Elige el que más te guste.
    La fuente utilizada para código : MSDN

    [TypeConverter(typeof(Contact))]
    [DescriptionAttribute("Expand to see the spelling options for the application.")]
    class Contact : ExpandableObjectConverter
    {
        [DefaultValueAttribute("Contact Name")]
        public string Name { get; set; }
        public string Address { get; set; }
    
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(Contact))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }
    
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(System.String) && value is Contact)
            {
                Contact contact = value as Contact;
    
                return string.Format("Name: {0} - Address: {1}", contact.Name, contact.Address);
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
    
    [TypeConverter(typeof(Contact2))]
    [DescriptionAttribute("Expand to see the spelling options for the application.")]
    class Contact2 : ExpandableObjectConverter
    {
        private Contact contato1;
        public Contact Contato1
        {
            get
            {
                return contato1;
            }
            set
            {
                contato1 = value;
            }
        }
    
        private Contact contato3;
        public Contact Contato3
        {
            get
            {
                return contato3;
            }
            set
            {
                contato3 = value;
            }
        }
    
        public Contact2()
        {
            this.contato1 = new Contact()
            {
                Address = "Add1",
                Name = "Name1"
            };
            this.contato3 = new Contact()
            {
                Address = "Add3",
                Name = "Name3"
            };
        }
    }
    
    public partial class Form2 : Form
    {
        PropertiesList<Contact> listContact = new PropertiesList<Contact>();
        //List<Contact> listContact = new List<Contact>();
    
        public Form2()
        {
            InitializeComponent();
        }
    
        private void Form2_Load(object sender, EventArgs e)
        {
            listContact.Clear();
            Contact newContact = null;
    
            newContact = new Contact();
            newContact.Name = "diana";
            newContact.Address = "en";
            listContact.Add(newContact);
    
            newContact = null;
            newContact = new Contact();
            newContact.Name = "maxim";
            newContact.Address = "cand";
            listContact.Add(newContact);
    
            propGrid.AllowDrop = true;
    
            object[] itens = new object[2];
            itens[0] = listContact;
            itens[1] = newContact;
            propGrid.SelectedObject = listContact;
            this.Controls.Add(propGrid);
            propGrid.Dock = DockStyle.Fill;
        }
    }
    
    [TypeConverter(typeof(Contact))]
    class PropertiesList<T> : ExpandableObjectConverter where T : Contact
    {
        private List<T> innerList = new List<T>();
    
        public List<string> Names
        {
            get
            {
                List<string> valuesReturned = null;
                if (innerList.Count > 0)
                {
                    valuesReturned = new List<string>();
                    for (int i = 0; i < innerList.Count; i++)
                    {
                        valuesReturned.Add(innerList[i].Name);
                    }
    
                }
                return valuesReturned;
            }
        }
    
        public List<T> Item
        {
            get
            {
                List<T> valuesReturned = null;
                if (innerList.Count > 0)
                {
                    valuesReturned = new List<T>();
                    for (int i = 0; i < innerList.Count; i++)
                    {
                        valuesReturned.Add(innerList[i]);
                    }
    
                }
                return valuesReturned;
            }
        }
    
        public Color GetColors { get; set; }
    
        public Contact2 Contato22
        {
            get
            {
                return new Contact2();
            }
        }
    
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(Contact))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }
    
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(System.String) && value is Contact)
            {
                Contact contact = value as Contact;
    
                return string.Format("Name: {0} - Address: {1}", contact.Name, contact.Address);
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    
        #region Simulate List
        public void Add(T item)
        {
            innerList.Add(item);
        }
    
        public void Clear()
        {
            innerList.Clear();
        }
        #endregion
    }
    • Gran código, Gracias.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea