Databinding to business objects and exceptions
Posted
Wednesday, January 18, 2006 1:09 PM
by
Maurice
One cool, and not quite new, feature of Visual Studio 2005 is data binding to your own business objects. Just create a new business object class, add a property, add it to the Data Sources window as an object data source and drag it onto your form. Simple as that and you are good to go.
However as usual there is a gotcha :-(
It throw an exception in a property get or get during the data binding the exception is eaten by the DataBindings object. There are two ways around this, either pass False as the formattingEnabled parameters or add an event handler to the BindingComplete event and check for the Exception property being set.
The first option seems the easiest but isn’t :-( Even if you set the Format type to no formatting in the Formatting and Advanced Binding dialog the formattingEnabled will still be true.
That leaves the second option. To handle the BindingComplete event you need to ass an event handler to all Binding objects on the form. Not difficult once you have a reference to all controls. The following code does just that.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each control As Control In GetAllControls(Me)
For Each binding As Binding In control.DataBindings
AddHandler binding.BindingComplete, AddressOf BindingCompleteHandler
Next
Next
End Sub
Private Sub BindingCompleteHandler(ByVal sender As Object, ByVal e As BindingCompleteEventArgs)
If e.Exception IsNot Nothing Then
Throw New Exception("Unhandled exception during databinding actions.", e.Exception)
End If
End Sub
Private Function GetAllControls(ByVal container As Control) As List(Of Control)
Dim result As New List(Of Control)
Dim pos As Integer = 0
result.Add(container)
Do While pos < result.Count
For Each control As Control In result(pos).Controls
result.Add(control)
Next
pos += 1
Loop
Return result
End Function
End Class
Public Class SomeData
Private _lastName As String = "Maurice de Beijer"
Public Property LastName() As String
Get
Throw New Exception("Get: " + _lastName)
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
End Class
Maurice de Beijer
www.TheProblemSolver.nl