Click here to Skip to main content
15,867,704 members
Articles / Programming Languages / C#
Article

Deep Binding

Rate me:
Please Sign up or sign in to vote.
4.30/5 (14 votes)
2 Jul 2005CPOL2 min read 70.1K   1K   25   18
Binding Complex objects to Windows Forms controls

Introduction

DataBinding is a very powerful tool to push data from objects to the user interface and pull back user data to the object. However, when you have complex objects, Windows Form DataBinding is not so powerful.

In this article, I will demonstrate how we can make a complex databinding between business objects and Windows Forms controls by implementing a few interfaces.

Sample screenshot

The "Complex Object" Sample

The sample here is a book that has Name, PagesNumber and Author properties. The author has name and BirthDate properties. In the object model, we create a book class that implements book properties and a second class Author. The Author property in the Book class is typed as Author.

Here is the code needed in the Book class:

C#
public class Book : BindableObject
{
public Book()
{
}
public Book(string name,int pagesnumber, Author a)
{
this.Name = name;
this.PagesNumber = pagesnumber;
this.Author = a;
}
private string _Name;
public string Name
{
get{return _Name;}
set{_Name = value;}
}
private int _PagesNumber;
public int PagesNumber
{
get{return _PagesNumber;}
set{_PagesNumber = value;}
}
public Author _Author = new Author();
public Author Author 
{
get{return _Author;}
set{_Author = value;}
}
}

The DataBinding Problem

When we want to create a collection of books and show it to the user in datagrid, we can show only the name and Pagesnumber information. That is because in the MappingName property of the DatagridTextBox, we cannot put Author.Name for example to display the name of the book's author.

The Solution

When binding an object to a Windows Form control, the Framework uses reflection to get bindable properties of the object. However, when an object implements the IcustomTypeDescriptor interface, the framework gets object properties from IcustomTypeDescriptor.GetProperties() method. So the solution is to include all the properties we need to display.

In book example IcustomTypeDescriptor.GetProperties() will return : Name, PagesNumber, Author.Name and Author.BirthDate properties.

Doing this, you can display the Author name of a book in a datagrid just by writing "Author.Name" in the MappingName property of the DatagridTextBox. Also if you have a multicolumn combobox, you can display both Book Name and Author Name.

The Source Code

A class name BindableObject is included in the project. This class implements IcustomTypeDescriptor interface. All business objects created (Book and Author classes) inherit from this class. So no code must be written in business classes.

To get properties of an object, reflection is used. To increase performance, I implemented a cache in which I store objects structure, so reflection is used only one time for each type.

When binding a collection, it must implement the ItypedList interface to call the IcustomTypeDescriptor.GetProperties() method. So the BookCollection class inherits from BindableCollection class included in the project.

History

  • 2nd July, 2005: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
France France
MCSD Asp.Net certified developer

Comments and Discussions

 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey8-Aug-12 23:39
professionalManoj Kumar Choubey8-Aug-12 23:39 
QuestionIf instead of having an object Author is a list object of Author? Pin
Albert Gassó3-Mar-12 5:21
Albert Gassó3-Mar-12 5:21 
QuestionStill the way to go in .NET 2.0? Pin
SoTTo4-Oct-07 23:51
SoTTo4-Oct-07 23:51 
AnswerRe: Still the way to go in .NET 2.0? Pin
Hayder Marzouk20-Nov-07 6:25
Hayder Marzouk20-Nov-07 6:25 
GeneralRe: Still the way to go in .NET 2.0? Pin
Etreus27-Nov-07 23:36
Etreus27-Nov-07 23:36 
GeneralBug Fix Pin
shumakercs16-Aug-07 5:14
shumakercs16-Aug-07 5:14 
GeneralRe: Bug Fix Pin
Hayder Marzouk21-Aug-07 6:11
Hayder Marzouk21-Aug-07 6:11 
GeneralBindingSource Problem Pin
Primadi12-Jul-06 16:48
Primadi12-Jul-06 16:48 
GeneralRe: BindingSource Problem Pin
Laurts2-Jan-07 2:52
Laurts2-Jan-07 2:52 
GeneralRe: BindingSource Problem Pin
User 46247825-Mar-07 4:28
User 46247825-Mar-07 4:28 
GeneralConversion Pin
stevenjnielsen11-Apr-06 6:45
stevenjnielsen11-Apr-06 6:45 
GeneralThis does not work with Iterator properteis Pin
mdn6667-Mar-06 22:53
mdn6667-Mar-06 22:53 
GeneralLooks like I gotta first bug. Pin
Alexei Tarnakin17-Jul-05 10:45
Alexei Tarnakin17-Jul-05 10:45 
GeneralRe: Looks like I gotta first bug. Pin
Anonymous17-Jul-05 23:12
Anonymous17-Jul-05 23:12 
It's not an ITypedList Problem. this line is the problem :
private BookCollection _books = new BookCollection();
It generates an overflowexception. The solution is to inialize collection in the get accessor of the property.
private BookCollection _books;
public BookCollection Attached
{
get
{
if (_books ==null)
{
_books = new BookCollection();
}
return _books;
}
set
{
_books = value;
}
}

It's the solution when u have properties typed as the parent object.
General[Message Deleted] Pin
Alexei Tarnakin18-Jul-05 10:50
Alexei Tarnakin18-Jul-05 10:50 
GeneralRe: Looks like I gotta first bug. Pin
Alexei Tarnakin19-Jul-05 5:21
Alexei Tarnakin19-Jul-05 5:21 
Generalnice job! Pin
Alexei Tarnakin17-Jul-05 10:26
Alexei Tarnakin17-Jul-05 10:26 
GeneralRe: nice job! Pin
Anonymous17-Jul-05 23:07
Anonymous17-Jul-05 23:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.