【问题标题】:Using a Dictionary in a propertygrid在属性网格中使用字典
【发布时间】:2010-12-28 01:35:00
【问题描述】:

我想使用属性网格编辑键值(字符串,字符串)项列表。当我使用Dictionary<string,string> 作为类型时,propertygrid 将显示一个 GUI,但它似乎没有“启用”,即。我无法添加任何项目。

是否支持 Dictionary 对象,或者是否有任何其他对象可以解决此问题?

【问题讨论】:

    标签: c# winforms data-binding propertygrid


    【解决方案1】:

    我过去是按照this code 做的:

    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);
    }
    

    为我们工作得很好。

    【讨论】:

    【解决方案2】:

    如果您尝试将包含 Dictionary 属性的类绑定到 PropertyGrid,而不是直接绑定 Dictionary 本身,那么这里有一个免费的(LGPL 许可的)组件可以做到这一点:http://gendictedit.codeplex.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多