你可以嘗試以覆蓋GetProperties()
方法創建的CustomTypeDescriptor
子類。然後你必須實現你自己的TypeDescriptionProvider
類來設置它們在期望的類的TypeDescriptionProviderAttribute
(它將被表示爲行)。
實施例:bind second-level properties
這是我的例子:
MyFieldsClass
[TypeDescriptionProvider(typeof(MyTypeDescriptionProvider))]
internal class MyFieldsClass
{
public int IntField;
public double DoubleField;
}
FieldPropertyDescriptor
internal sealed class FieldPropertyDescriptor<TComponent, TField> : PropertyDescriptor
{
private readonly FieldInfo fieldInfo;
public FieldPropertyDescriptor(string name)
: base(name, null)
{
fieldInfo = typeof(TComponent).GetField(Name);
}
public override bool IsReadOnly { get { return false; } }
public override void ResetValue(object component) { }
public override bool CanResetValue(object component) { return false; }
public override bool ShouldSerializeValue(object component)
{
return true;
}
public override Type ComponentType
{
get { return typeof(TComponent); }
}
public override Type PropertyType
{
get { return typeof(TField); }
}
public override object GetValue(object component)
{
return fieldInfo.GetValue(component);
}
public override void SetValue(object component, object value)
{
fieldInfo.SetValue(component, value);
OnValueChanged(component, EventArgs.Empty);
}
}
MyCustomTypeDe scriptor
internal sealed class MyCustomTypeDescriptor : CustomTypeDescriptor
{
public MyCustomTypeDescriptor(ICustomTypeDescriptor parent)
: base(parent)
{
}
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
return GetProperties();
}
public override PropertyDescriptorCollection GetProperties()
{
return AddItems(base.GetProperties(),
new FieldPropertyDescriptor<MyFieldsClass, int>("IntField"),
new FieldPropertyDescriptor<MyFieldsClass, double>("DoubleField"));
}
private static PropertyDescriptorCollection AddItems(PropertyDescriptorCollection cols, params PropertyDescriptor[] items)
{
PropertyDescriptor[] array = new PropertyDescriptor[cols.Count + items.Length];
cols.CopyTo(array, 0);
for (int i = 0; i < items.Length; i++)
array[cols.Count + i] = items[i];
PropertyDescriptorCollection newcols = new PropertyDescriptorCollection(array);
return newcols;
}
}
MyTypeDescriptionProvider
internal sealed class MyTypeDescriptionProvider : TypeDescriptionProvider
{
private ICustomTypeDescriptor td;
public MyTypeDescriptionProvider()
: this(TypeDescriptor.GetProvider(typeof(MyFieldsClass)))
{
}
public MyTypeDescriptionProvider(TypeDescriptionProvider parent)
: base(parent)
{
}
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
{
return td ?? (td = new MyCustomTypeDescriptor(base.GetTypeDescriptor(objectType, instance)));
}
}
用例:
dataGridView1.DataSource = new List<MyFieldsClass>(new[] { new MyFieldsClass { IntField = 1, DoubleField = 10.0 } });
它在技術上並不在DataGridView不允許此。它是內部使用的CurrencyManager類,只允許屬性而不允許使用字段。我想不出有什麼好辦法去做你想問的問題。 – test
如果網格僅用於查看,您可以嘗試使用LINQ將IEnumerable對象轉換爲匿名對象,並在其中創建字段等的屬性。 – LarsTech