Click here to Skip to main content
11,640,521 members (59,299 online)
Click here to Skip to main content

Implementing a strongly typed collection with sort/filter/GetChanges features

, 6 Jul 2005 147.8K 1K 39
Rate this:
Please Sign up or sign in to vote.
A strongly typed collection that implements CollectionBase and IBindingList interfaces with interesting features (sort, filter, getchanges).


In my first steps with .NET, I was impressed by the dataset features. Data access was very simple to use/ to bind on Windows forms components such as DataGrid or ComboBox. But with datasets we are far from OOP. We are always working with Tables (DataTable), rows and columns. So when I began to create my own business objects, all became so difficult: data access problems, binding problems and collection problems. I needed a collection of each business objects that presents the DataSet/DataView features (Sorting, Filtering and the DataSet's GetChanges feature) and it must not be a dataset.

I found many discussion about Collection / Strongly Typed Collections but no one presents all features I needed. So I decided to develop my own custom collection that implements the needed interfaces and functions to be simple to use with Windows forms and also in data access.


  • DataBinding

    The custom collection inherits from CollectionBase abstract class and implements IBindingList interface and can be bound on all controls of Windows forms (datagrid, combo, list,...).

  • Sorting

    The sorting feature is implemented in the IBindingList Interface. So you can sort a column in a DataGrid by clicking on the header of the column.

    Sorting is accessible with a Sort method that accepts a string as parameter ( like the property of the DataView).

  • Filtering

    Dataview presents an very useful feature specially when bound to a DataGrid: Filtering. The custom collection offers too the same feature via the ItemFilter property (RowFilter in the DataView). You can set to the ItemFilter property a string like "Name = Test" or "BirthDate > 01/01/1980" and the collection is updated to display only items that respond to the criteria.

  • GetChanges feature

    The custom collection is based on an abstract object called BaseObject which have a property called ObjectState that can be UnChanged, Added, Deleted or Changed. So any action you do on the collection is stored and you can have the 'List of Changes" made by the user on the collection of items.

    So any business object you need to implement in a collection must inherit from BaseObject.


To create your own custom collection, you need a business object that inherits from BaseObject class. For example, if you create a customer class which present a Name property, this code is needed :

public class Customer : BaseObject
    public Customer()
        // TODO: Add constructor logic here
    private string TmpName;
    public string Name
        get{return TmpName;}
            if (base.Compare(TmpName, value) !=0)
                TmpName = value;
                SetDirtyFlag(); // To set the isdirty property of the object to true


Then create the Customers class which inherit from abstract class CustomCollection. Code will be like this:

public class Customers: CustomCollection
   public Customers()
       // define the type of the collection items to Customer
       this.ItemType = typeof(Customer); 
   //indexer that overides the default indexer
   public new Customer this[int index]
         return (Customer)(base[index]);
         base[index] = value;
// GetChanges Method that overrides the default one 
//to have a Customer Collection in return
    public new Customers GetChanges()
        return (Customers) base.GetChanges();

The demo project includes also source code of CustomCollection and BaseObject.


With this CustomCollection, no need to work with DataSets and DataViews. It combines the features of both of these components and we can work with our business objects. So data access can be easier, databinding in Windows forms and web forms is assured and performance is much better than dataset when filling the custom collection from a datareader.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Hayder Marzouk
Web Developer
France France
MCSD Asp.Net certified developer

You may also be interested in...

Comments and Discussions

QuestionFind? Pin
ble0t26-Oct-06 6:28
memberble0t26-Oct-06 6:28 version? Pin
cxjc23-Aug-06 5:38
membercxjc23-Aug-06 5:38 
QuestionNot Case sensative? Pin
BigJoe7141-Jun-06 14:16
memberBigJoe7141-Jun-06 14:16 
GeneralVB.Net Version Pin
srinum28-Feb-06 5:32
membersrinum28-Feb-06 5:32 
QuestionWhat about design-time support for data binding Pin
AlisterTheDog14-Jan-06 8:55
memberAlisterTheDog14-Jan-06 8:55 
QuestionSerialization? Pin
belchski14-Nov-05 9:22
memberbelchski14-Nov-05 9:22 
AnswerRe: Serialization? Pin
Ashwin Seshadri14-Nov-05 13:06
memberAshwin Seshadri14-Nov-05 13:06 
GeneralRe: Serialization? Pin
belchski14-Nov-05 13:20
memberbelchski14-Nov-05 13:20 
GeneralRe: Serialization? Pin
Johny Nguyen23-Nov-05 16:23
memberJohny Nguyen23-Nov-05 16:23 
GeneralRe: Serialization? Pin
Patrick Hatton21-Dec-05 6:00
memberPatrick Hatton21-Dec-05 6:00 
GeneralRe: Serialization? Pin
srinum23-Feb-06 9:02
membersrinum23-Feb-06 9:02 
GeneralRe: Serialization? Pin
srinum23-Feb-06 10:37
membersrinum23-Feb-06 10:37 
GeneralRe: Serialization? Pin
Atlas200228-Feb-06 4:01
memberAtlas200228-Feb-06 4:01 
GeneralI greatly increased performance!!!! Pin
Alexei Tarnakin18-Oct-05 0:47
memberAlexei Tarnakin18-Oct-05 0:47 
GeneralRe: I greatly increased performance!!!! Pin
Anonymous18-Oct-05 1:55
sussAnonymous18-Oct-05 1:55 
GeneralRe: I greatly increased performance!!!! Pin
Alexei Tarnakin18-Oct-05 5:28
memberAlexei Tarnakin18-Oct-05 5:28 
GeneralProblem with clear method Pin
Alexei Tarnakin28-Sep-05 22:01
memberAlexei Tarnakin28-Sep-05 22:01 
GeneralRe: Problem with clear method Pin
Johny Nguyen17-Oct-05 23:49
memberJohny Nguyen17-Oct-05 23:49 
GeneralRe: Problem with clear method Pin
Alexei Tarnakin18-Oct-05 0:31
memberAlexei Tarnakin18-Oct-05 0:31 
GeneralRe: Problem with clear method Pin
Johny Nguyen19-Oct-05 18:52
memberJohny Nguyen19-Oct-05 18:52 
GeneralRe: Problem with clear method Pin
Alexei Tarnakin20-Oct-05 0:36
memberAlexei Tarnakin20-Oct-05 0:36 
QuestionWhere is the end? Pin
Alexei Tarnakin23-Aug-05 8:31
memberAlexei Tarnakin23-Aug-05 8:31 
AnswerRe: Where is the end? Pin
Hayder Marzouk23-Aug-05 22:29
memberHayder Marzouk23-Aug-05 22:29 
Generalimprovements Pin
Alexei Tarnakin17-Jun-05 4:51
memberAlexei Tarnakin17-Jun-05 4:51 
GeneralRe: improvements Pin
Alexei Tarnakin17-Jun-05 5:15
memberAlexei Tarnakin17-Jun-05 5:15 
GeneralRe: improvements Pin
Hayder Marzouk17-Jun-05 7:44
memberHayder Marzouk17-Jun-05 7:44 
GeneralRe: improvements Pin
Hayder Marzouk20-Jun-05 1:39
memberHayder Marzouk20-Jun-05 1:39 
GeneralRe: improvements Pin
Alexei Tarnakin24-Jun-05 9:35
memberAlexei Tarnakin24-Jun-05 9:35 
GeneralRe: improvements Pin
Hayder Marzouk29-Jun-05 9:07
memberHayder Marzouk29-Jun-05 9:07 
GeneralRe: improvements Pin
Alexei Tarnakin1-Jul-05 2:23
memberAlexei Tarnakin1-Jul-05 2:23 
GeneralRe: improvements Pin
Hayder Marzouk2-Jul-05 10:14
memberHayder Marzouk2-Jul-05 10:14 
GeneralRe: improvements Pin
Alexei Tarnakin3-Jul-05 4:27
memberAlexei Tarnakin3-Jul-05 4:27 
GeneralRe:Improvements Pin
Hayder Marzouk3-Jul-05 10:43
memberHayder Marzouk3-Jul-05 10:43 
GeneralRe:Improvements Pin
Alexei Tarnakin5-Jul-05 4:41
memberAlexei Tarnakin5-Jul-05 4:41 
GeneralRe:Improvements Pin
Alexei Tarnakin5-Jul-05 5:07
memberAlexei Tarnakin5-Jul-05 5:07 
GeneralRe:Improvements Pin
Hayder Marzouk5-Jul-05 21:47
memberHayder Marzouk5-Jul-05 21:47 
GeneralRe:Improvements Pin
Hayder Marzouk5-Jul-05 21:56
memberHayder Marzouk5-Jul-05 21:56 
GeneralRe:Improvements Pin
Hayder Marzouk5-Jul-05 21:52
memberHayder Marzouk5-Jul-05 21:52 
GeneralRe:Improvements Pin
Alexei Tarnakin5-Jul-05 23:30
memberAlexei Tarnakin5-Jul-05 23:30 
GeneralRe:Improvements Pin
Alexei Tarnakin6-Jul-05 4:12
memberAlexei Tarnakin6-Jul-05 4:12 
GeneralRejectChanges method to BaseList object Pin
Johny Nguyen15-Jun-05 22:45
memberJohny Nguyen15-Jun-05 22:45 
GeneralRe: RejectChanges method to BaseList object Pin
Hayder Marzouk16-Jun-05 0:16
memberHayder Marzouk16-Jun-05 0:16 
GeneralRe: RejectChanges method to BaseList object Pin
Johny Nguyen16-Jun-05 18:06
memberJohny Nguyen16-Jun-05 18:06 
GeneralHowto Implement IEditableObject method Pin
Johny Nguyen6-Jun-05 18:59
memberJohny Nguyen6-Jun-05 18:59 
GeneralRe: Howto Implement IEditableObject method Pin
Hayder Marzouk6-Jun-05 23:21
memberHayder Marzouk6-Jun-05 23:21 
QuestionHow to set ObjectStateType of Changed Pin
Johny Nguyen5-Jun-05 23:08
memberJohny Nguyen5-Jun-05 23:08 
AnswerRe: How to set ObjectStateType of Changed Pin
Hayder Marzouk6-Jun-05 3:21
memberHayder Marzouk6-Jun-05 3:21 
GeneralFiltering Pin
mailbox4spam8-May-05 11:56
membermailbox4spam8-May-05 11:56 
GeneralRe: Filtering Pin
Hayder Marzouk9-May-05 6:49
memberHayder Marzouk9-May-05 6:49 
GeneralProblem in Compare Pin
Marc Brooks18-Apr-05 9:30
memberMarc Brooks18-Apr-05 9:30 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150731.1 | Last Updated 6 Jul 2005
Article Copyright 2005 by Hayder Marzouk
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid