如何在绑定到字典的 Propertygrid 中显示下拉列表
How to show Dropdown in a Propertygrid binding to Dictionary
我想在 属性 网格中显示所选值的字符串下拉列表。
在我目前的情况下,我必须将字典对象绑定到 属性 网格。
如果我要绑定一个 class,那么使用 TypeConverter 就可以很容易地按照下面的方式进行。
public class Employee
{
public string Name { get; set; }
[TypeConverter(typeof(JobCategoryConverter))]
public int? Category { get; set; }
}
private void Form1_Load(object sender, EventArgs e)
{
Employee emp = new Employee() {Name = "Ray" ,Category = 1 };
propertyGrid1.SelectedObject = emp;
}
结果是这样的。
如果我绑定到字典,有什么建议可以显示这个下拉菜单吗?我使用 this code 将字典绑定到 属性 网格。
所以代码看起来像,
private void Form1_Load(object sender, EventArgs e)
{
IDictionary dict = new Hashtable();
dict["Name"] = "Ray";
dict["Category"] = 1;
DictionaryPropertyGridAdapter dpg = new DictionaryPropertyGridAdapter(dict);
propertyGrid1.SelectedObject = dpg;
}
这个比较容易。
想法是允许为自定义 DictionaryPropertyDescriptor
指定属性。
首先,将 DictionaryPropertyDescriptor
class 构造函数更改为:
internal DictionaryPropertyDescriptor(IDictionary d, object key, Attribute[] attributes)
: base(key.ToString(), attributes)
{
_dictionary = d;
_key = key;
}
然后将以下内容添加到 DictionaryPropertyGridAdapter
class:
public Dictionary<string, Attribute[]> PropertyAttributes;
并将 GetProperties
方法更改为:
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
ArrayList properties = new ArrayList();
foreach (DictionaryEntry e in _dictionary)
{
Attribute[] attrs;
if (PropertyAttributes == null || !PropertyAttributes.TryGetValue(e.Key.ToString(), out attrs))
attrs = null;
properties.Add(new DictionaryPropertyDescriptor(_dictionary, e.Key, attrs));
}
PropertyDescriptor[] props =
(PropertyDescriptor[])properties.ToArray(typeof(PropertyDescriptor));
return new PropertyDescriptorCollection(props);
}
您已完成所需的更改。
现在您可以将 TypeConverter
与您的 "property" 关联起来,就像您对 class 所做的那样:
enum JobCategory { Accountant = 1, Engineer, Manager }
class JobCategoryConverter : EnumConverter
{
public JobCategoryConverter() : base(typeof(JobCategory)) { }
}
private void Form1_Load(object sender, EventArgs e)
{
IDictionary dict = new Hashtable();
dict["Name"] = "Ray";
dict["Category"] = 1;
DictionaryPropertyGridAdapter dpg = new DictionaryPropertyGridAdapter(dict);
dpg.PropertyAttributes = new Dictionary<string, Attribute[]>
{
{ "Category", new Attribute[] { new TypeConverterAttribute(typeof(JobCategoryConverter)) } }
};
propertyGrid1.SelectedObject = dpg;
}
结果将是:
您还可以关联其他属性,例如 DisplayName
、Category
等
我想在 属性 网格中显示所选值的字符串下拉列表。 在我目前的情况下,我必须将字典对象绑定到 属性 网格。
如果我要绑定一个 class,那么使用 TypeConverter 就可以很容易地按照下面的方式进行。
public class Employee
{
public string Name { get; set; }
[TypeConverter(typeof(JobCategoryConverter))]
public int? Category { get; set; }
}
private void Form1_Load(object sender, EventArgs e)
{
Employee emp = new Employee() {Name = "Ray" ,Category = 1 };
propertyGrid1.SelectedObject = emp;
}
结果是这样的。
如果我绑定到字典,有什么建议可以显示这个下拉菜单吗?我使用 this code 将字典绑定到 属性 网格。
所以代码看起来像,
private void Form1_Load(object sender, EventArgs e)
{
IDictionary dict = new Hashtable();
dict["Name"] = "Ray";
dict["Category"] = 1;
DictionaryPropertyGridAdapter dpg = new DictionaryPropertyGridAdapter(dict);
propertyGrid1.SelectedObject = dpg;
}
这个比较容易。
想法是允许为自定义 DictionaryPropertyDescriptor
指定属性。
首先,将 DictionaryPropertyDescriptor
class 构造函数更改为:
internal DictionaryPropertyDescriptor(IDictionary d, object key, Attribute[] attributes)
: base(key.ToString(), attributes)
{
_dictionary = d;
_key = key;
}
然后将以下内容添加到 DictionaryPropertyGridAdapter
class:
public Dictionary<string, Attribute[]> PropertyAttributes;
并将 GetProperties
方法更改为:
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
ArrayList properties = new ArrayList();
foreach (DictionaryEntry e in _dictionary)
{
Attribute[] attrs;
if (PropertyAttributes == null || !PropertyAttributes.TryGetValue(e.Key.ToString(), out attrs))
attrs = null;
properties.Add(new DictionaryPropertyDescriptor(_dictionary, e.Key, attrs));
}
PropertyDescriptor[] props =
(PropertyDescriptor[])properties.ToArray(typeof(PropertyDescriptor));
return new PropertyDescriptorCollection(props);
}
您已完成所需的更改。
现在您可以将 TypeConverter
与您的 "property" 关联起来,就像您对 class 所做的那样:
enum JobCategory { Accountant = 1, Engineer, Manager }
class JobCategoryConverter : EnumConverter
{
public JobCategoryConverter() : base(typeof(JobCategory)) { }
}
private void Form1_Load(object sender, EventArgs e)
{
IDictionary dict = new Hashtable();
dict["Name"] = "Ray";
dict["Category"] = 1;
DictionaryPropertyGridAdapter dpg = new DictionaryPropertyGridAdapter(dict);
dpg.PropertyAttributes = new Dictionary<string, Attribute[]>
{
{ "Category", new Attribute[] { new TypeConverterAttribute(typeof(JobCategoryConverter)) } }
};
propertyGrid1.SelectedObject = dpg;
}
结果将是:
您还可以关联其他属性,例如 DisplayName
、Category
等