El uso de un Diccionario en un propertygrid

Me gustaría editar una lista de valor de la clave(string, string) los elementos con un propertygrid. Cuando yo uso una Dictionary<string,string> como tipo el propertygrid mostrará una interfaz gráfica de usuario, pero no parece «habilitado», es decir,. Yo no puedo agregar elementos.

Es el Diccionario de objetos compatibles, o cualquier otro objeto con el que yo podría resolver este problema?

InformationsquelleAutor Robert Massa | 2009-12-18

2 Kommentare

  1. 24

    He hecho lo siguiente este código en el pasado:

    class DictionaryPropertyGridAdapter : ICustomTypeDescriptor
    {
        IDictionary _dictionary;
    
        public DictionaryPropertyGridAdapter(IDictionary d)
        {
            _dictionary = d;
        }
    
        public string GetComponentName()
        {
            return TypeDescriptor.GetComponentName(this, true);
        }
    
        public EventDescriptor GetDefaultEvent()
        {
            return TypeDescriptor.GetDefaultEvent(this, true);
        }
    
        public string GetClassName()
        {
            return TypeDescriptor.GetClassName(this, true);
        }
    
        public EventDescriptorCollection GetEvents(Attribute[] attributes)
        {
            return TypeDescriptor.GetEvents(this, attributes, true);
        }
    
        EventDescriptorCollection System.ComponentModel.ICustomTypeDescriptor.GetEvents()
        {
            return TypeDescriptor.GetEvents(this, true);
        }
    
        public TypeConverter GetConverter()
        {
            return TypeDescriptor.GetConverter(this, true);
        }
    
        public object GetPropertyOwner(PropertyDescriptor pd)
        {
            return _dictionary;
        }
    
        public AttributeCollection GetAttributes()
        {
            return TypeDescriptor.GetAttributes(this, true);
        }
    
        public object GetEditor(Type editorBaseType)
        {
            return TypeDescriptor.GetEditor(this, editorBaseType, true);
        }
    
        public PropertyDescriptor GetDefaultProperty()
        {
            return null;
        }
    
        PropertyDescriptorCollection
            System.ComponentModel.ICustomTypeDescriptor.GetProperties()
        {
            return ((ICustomTypeDescriptor)this).GetProperties(new Attribute[0]);
        }
    
        public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        {
            ArrayList properties = new ArrayList();
            foreach (DictionaryEntry e in _dictionary)
            {
                properties.Add(new DictionaryPropertyDescriptor(_dictionary, e.Key));
            }
    
            PropertyDescriptor[] props =
                (PropertyDescriptor[])properties.ToArray(typeof(PropertyDescriptor));
    
            return new PropertyDescriptorCollection(props);
        }
    }
    
    class DictionaryPropertyDescriptor : PropertyDescriptor
    {
        IDictionary _dictionary;
        object _key;
    
        internal DictionaryPropertyDescriptor(IDictionary d, object key)
            : base(key.ToString(), null)
        {
            _dictionary = d;
            _key = key;
        }
    
        public override Type PropertyType
        {
            get { return _dictionary[_key].GetType(); }
        }
    
        public override void SetValue(object component, object value)
        {
            _dictionary[_key] = value;
        }
    
        public override object GetValue(object component)
        {
            return _dictionary[_key];
        }
    
        public override bool IsReadOnly
        {
            get { return false; }
        }
    
        public override Type ComponentType
        {
            get { return null; }
        }
    
        public override bool CanResetValue(object component)
        {
            return false;
        }
    
        public override void ResetValue(object component)
        {
        }
    
        public override bool ShouldSerializeValue(object component)
        {
            return false;
        }
    }
    
    private void Form1_Load(object sender, System.EventArgs e)
    {
        IDictionary d = new Hashtable();
        d["Hello"] = "World";
        d["Meaning"] = 42;
        d["Shade"] = Color.ForestGreen;
    
        propertyGrid1.SelectedObject = new DictionaryPropertyGridAdapter(d);
    }

    Funcionado bien para nosotros.

Kommentieren Sie den Artikel

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