Hey,
I am customizing a DataGridView control. The DataGridView is supposed to be bound to a collection of some type (be it a List(Of T) or ArrayList or whatever), and the idea is that one can easily determine (at design-time in this case) which properties of the type have to be shown in the grid and which column header name they should get. One can do this using an attribute. For example, if I have a class Person with Name, Age and HairColor and I don't want to show the HairColor property, and want to show the Name property as 'Person', I would use:
vb.net Code:
Public Class Person <Grid.GridOptions(displayName:="Person", visible:=True)> _ Public Property Name As String Public Property Age As Integer <Grid.GridOptions(visible:=False)> _ Public Property HairColor As Color End Class
I do this during run-time by simply looping through the properties of the bound type (in this case Person), retrieving the GridOptions attribute (if any) and checking the values provided.
This works just fine except for one thing: I'm not really sure how to determine the type in the databound collection...
At the moment, I cast the DataSource property to an IList and retrieve the type of the first instance in that list (if any). If there isn't a first instance (the list is empty) then I don't know how to get the type...
Often I know that it will be impossible to know the type. If someone is binding an ArrayList for example, then it's impossible to know what kind of items he's going to put in that ArrayList. Even the normal DataGridView cannot show any columns when databound to an empty ArrayList.
However, the framework's DataGridView does show the columns when bound to, for example, an empty List(Of Person), or a Person array.
How does it do this? And more importantly: how can I do this?
I'm pretty sure that casting the DataSource to an IList is not the correct way as all information about the type of items in that list is then lost. But I'm not sure what else to cast it to... ITypedList? IBindingList? I even considered List(Of T) because that's all I am going to be using, but besides the fact that the grid would then obviously only work for a List(Of T) I still don't know how to do this... I don't know 'T' so I can't cast it to a List(Of T)...
I'm a little lost![]()




Reply With Quote