2009-12-18 1 views
11

Я хотел бы отредактировать список элементов ключа (строка, строка) с помощью свойстваgrid. Когда я использую Dictionary<string,string> как тип, свойствоgrid покажет графический интерфейс, но он не кажется «включенным», т.е. Я не могу добавить какие-либо предметы.Использование словаря в propertygrid

Поддерживается ли объект Dictionary, или есть ли какой-либо другой объект, с помощью которого я мог бы решить эту проблему?

ответ

18

Я сделал это следующий 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); 
} 

работал хорошо для нас.

+0

спасибо дружище ! ваш код очень помогает. –

2

Если вы пытаетесь связать класс, который содержит словарь свойства для PropertyGrid, а не связывание самого словаря непосредственно, то здесь свободный (LGPL лицензионной) компонент, который делает именно то, что: http://gendictedit.codeplex.com/

 Смежные вопросы

  • Нет связанных вопросов^_^