Introduction
I needed to bind a DataGridView
to a generic collection of custom classes, in an application written in Visual Basic 2008. The objective to reach was that, whenever editing, adding, or deleting items from the DataGridView
, the collection gets updated and vice versa.
Using the Code
The .NET Framework exposes a very useful object called BindingSource
. This can be used also at design-time, but in this particular case, you’re not allowed to bind objects which are not defined as classes. In my own situation, I had to instantiate a collection inside a module, so this is a scenario which is not reachable at design-time using a BindingSource
, but it is by writing a few lines of code. Let’s suppose we have the typical example class for learning, which is the Person
class:
Public Class Person
Private _lastName As String
Private _name As String
Public Property LastName() As String
Get
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal name As String, ByVal lastName As String)
_name = name
_lastName = lastName
End Sub
End Class
Now, let’s suppose we need to instantiate a collection of Person
objects. In my own situation, this happens inside a Module
, but in the example, it can happen inside the Sub Main
of a Console application. This is the code:
Dim People As New List(Of Person)
The next step is to instantiate a BindingSource
object and then assign its DataSource
property to the above collection:
Dim PeopleBindingSource As New BindingSource
PeopleBindingSource.DataSource = People
In the Form containing the DataGridView
, assign its DataSource
property like this:
PeopleDataGridView.DataSource = PeopleBindingSource
Points of Interest
This kind of data-binding allows to simultaneously update the DataGridView
and the bound collection, whichever of the two objects you’re going to edit. Moreover, in this particular case, if the AutoGenerateColumns
property of the DataGridView
control is set to True
, the .NET Framework automatically generates as many columns as there are properties in the bound class (in our case, two columns, Name
and LastName
). Obviously, if you write code like the one shown above, you don’t need to set any data-binding property at design-time. I hope this article can be useful since on the Internet I found only articles about collections data-binding to a DataGridView
where data is not editable, or the solution is only available in C#.