前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PropertyGrid绑定Dictionary

PropertyGrid绑定Dictionary

作者头像
跟着阿笨一起玩NET
发布2018-09-18 14:35:50
8370
发布2018-09-18 14:35:50
举报
文章被收录于专栏:跟着阿笨一起玩NET

本文摘抄:http://greatverve.cnblogs.com/archive/2012/02/08/propergrid-Dictionary.html

PropertyGrid直接绑定Dictionary显示的是数据类型,若要显示为Text|Value需要处理一下。 直接绑定显示如下 我们希望显示如下

代码语言:javascript
复制
private void Form6_Load(object sender, EventArgs e)
{
    Dictionary<int, string> dicTest = new Dictionary<int, string>();
    dicTest.Add(0, "第一项");
    dicTest.Add(3, "第二项");
    dicTest.Add(5, "第三项");
    dicTest.Add(1, "第四项");
    //propertyGrid1.SelectedObject = dicTest;
    //IDictionary d = new Hashtable();
    //d["Hello"] = "World";
    //d["Meaning"] = 42;
    //d["Shade"] = Color.ForestGreen;
    propertyGrid1.SelectedObject = new DictionaryPropertyGridAdapter(dicTest);
}
class DictionaryPropertyGridAdapter : ICustomTypeDescriptor
{
    IDictionary _dictionary;
    public DictionaryPropertyGridAdapter(IDictionary d)
    {
        _dictionary = d;
    }
    //Three of the ICustomTypeDescriptor methods are never called by the property grid, but we'll stub them out properly anyway:
    public string GetComponentName()
    {
        return TypeDescriptor.GetComponentName(this, true);
    }
    public EventDescriptor GetDefaultEvent()
    {
        return TypeDescriptor.GetDefaultEvent(this, true);
    }
    public string GetClassName()
    {
        return TypeDescriptor.GetClassName(this, true);
    }
    //Then there's a whole slew of methods that are called by PropertyGrid, but we don't need to do anything interesting in them:
    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]);
    }
    //Then the interesting bit. We simply iterate over the IDictionary, creating a property descriptor for each entry:
    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
{
    //PropertyDescriptor provides 3 constructors. We want the one that takes a string and an array of attributes:
    IDictionary _dictionary;
    object _key;
    internal DictionaryPropertyDescriptor(IDictionary d, object key)
        : base(key.ToString(), null)
    {
        _dictionary = d;
        _key = key;
    }
    //The attributes are used by PropertyGrid to organise the properties into categories, to display help text and so on. We don't bother with any of that at the moment, so we simply pass null.
    //The first interesting member is the PropertyType property. We just get the object out of the dictionary and ask it:
    public override Type PropertyType
    {
        get { return _dictionary[_key].GetType(); }
    }
    //If you knew that all of your values were strings, for example, you could just return typeof(string).
    //Then we implement SetValue and GetValue:
    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 propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
    MessageBox.Show(e.ChangedItem.Label + "," + e.ChangedItem.Value);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-04-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档