我很清楚< System.ComponentModel.Browsable(“False”)>我可以应用于类的每个属性的属性.是否可以将所有属性的Browsable属性的默认值设置为False?
下面的代码编译并说明了我想要实现的内容,但遗憾的是它不能按预期工作:
<Browsable(False)>
Public Class SomeClass
Public Property HiddenByDefaultProperty1 As Object
Public Property HiddenByDefaultProperty2 As Object
...
<Browsable(True)> Public Property BrowsableProperty As Object
End Class
要达到我想要的效果,我必须应用< Browsable(False)>我不希望在我的DataGridView中显示的所有属性,这是很多代码混乱.
如果我只需要指定< Browsable(True)>那就太棒了.对于我想要展示的属性.但是:有可能吗?
解决方法:
不,我认为使用browsable属性不可能.但是,您可以通过实现ICustomTypeDescriptor接口来控制DataGridView将绑定到哪些属性.
模型
C#:
public class Foo : ICustomTypeDescriptor
{
public string P1 { get; set; }
public string P2 { get; set; }
public string P3 { get; set; }
public string P4 { get; set; }
public string P5 { get; set; }
public string P6 { get; set; }
public string P7 { get; set; }
public string P8 { get; set; }
public string P9 { get; set; }
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
{
var properties = new[] { "P1", "P3", "P7" };
var descriptors = TypeDescriptor
.GetProperties(typeof(Foo))
.Cast<PropertyDescriptor>()
.Where(p => properties.Any(s => s == p.Name))
.ToArray();
return new PropertyDescriptorCollection(descriptors);
}
AttributeCollection ICustomTypeDescriptor.GetAttributes()
{
return new AttributeCollection(null);
}
string ICustomTypeDescriptor.GetClassName()
{
return null;
}
string ICustomTypeDescriptor.GetComponentName()
{
return null;
}
TypeConverter ICustomTypeDescriptor.GetConverter()
{
return null;
}
EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
{
return null;
}
PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
{
return null;
}
object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
{
return null;
}
EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
{
return new EventDescriptorCollection(null);
}
EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
{
return new EventDescriptorCollection(null);
}
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
{
return ((ICustomTypeDescriptor)this).GetProperties(null);
}
object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
}
VB.Net:
Public Class Foo
Implements ICustomTypeDescriptor
Public Property P1 As String
Public Property P2 As String
Public Property P3 As String
Public Property P4 As String
Public Property P5 As String
Public Property P6 As String
Public Property P7 As String
Public Property P8 As String
Public Property P9 As String
Private Function GetProperties(attributes() As Attribute) As PropertyDescriptorCollection Implements ICustomTypeDescriptor.GetProperties
Dim properties = {"P1", "P3", "P7"}
Dim descriptors = TypeDescriptor _
.GetProperties(GetType(Foo)) _
.Cast(Of PropertyDescriptor) _
.Where(Function(p) properties.Any(Function(s) s = p.Name)) _
.ToArray()
Return New PropertyDescriptorCollection(descriptors)
End Function
Private Function GetAttributes() As AttributeCollection Implements ICustomTypeDescriptor.GetAttributes
Return New AttributeCollection(Nothing)
End Function
Private Function GetClassName() As String Implements ICustomTypeDescriptor.GetClassName
Return Nothing
End Function
Private Function GetComponentName() As String Implements ICustomTypeDescriptor.GetComponentName
Return Nothing
End Function
Private Function GetConverter() As TypeConverter Implements ICustomTypeDescriptor.GetConverter
Return Nothing
End Function
Private Function GetDefaultEvent() As EventDescriptor Implements ICustomTypeDescriptor.GetDefaultEvent
Return Nothing
End Function
Private Function GetDefaultProperty() As PropertyDescriptor Implements ICustomTypeDescriptor.GetDefaultProperty
Return Nothing
End Function
Private Function GetEditor(editorBaseType As Type) As Object Implements ICustomTypeDescriptor.GetEditor
Return Nothing
End Function
Private Function GetEvents() As EventDescriptorCollection Implements ICustomTypeDescriptor.GetEvents
Return New EventDescriptorCollection(Nothing)
End Function
Private Function GetEvents(attributes() As Attribute) As EventDescriptorCollection Implements ICustomTypeDescriptor.GetEvents
Return New EventDescriptorCollection(Nothing)
End Function
Private Function GetProperties() As PropertyDescriptorCollection Implements ICustomTypeDescriptor.GetProperties
Return DirectCast(Me, ICustomTypeDescriptor).GetProperties(Nothing)
End Function
Private Function GetPropertyOwner(pd As PropertyDescriptor) As Object Implements ICustomTypeDescriptor.GetPropertyOwner
Return Me
End Function
End Class
DataGridView的:
C#:
var list = new List<Foo>();
list.Add(new Foo());
list.Add(new Foo());
list.Add(new Foo());
this.dataGridView1.DataSource = list;
VB.Net:
Dim list As New List(Of Foo)
list.Add(New Foo())
list.Add(New Foo())
list.Add(New Foo())
Me.DataGridView1.DataSource = list
PropertyGrid中:
C#:
this.propertyGrid1.SelectedObject = new Foo();
VB.Net:
Me.PropertyGrid1.SelectedObject = New Foo()