Binding custom objects to datagrid WITHOUT using Collectionbase

Discussion in 'ASP .Net Datagrid Control' started by Rachel Koktava, Sep 1, 2003.

  1. Hi

    I'm having difficulty bind a collection of custom objects to a
    datagrid. For reasons that I'll explain shortly I can't use
    Collectionbase, so have instead implemented a custom collection with
    the interfaces IList, ICollection and IEnumerable.

    This class works find for indexing or iterating (foreach etc), but
    when set as the datasource for a web datagrid control it throws an
    exception on callinging the datagrids DataBind() method:

    [ArgumentNullException: Value cannot be null.
    Parameter name: component]
    System.ComponentModel.TypeDescriptor.GetProperties(Object
    component, Boolean noCustomTypeDesc) +173
    System.ComponentModel.TypeDescriptor.GetProperties(Object
    component) +7
    System.Web.UI.WebControls.BoundColumn.OnDataBindColumn(Object
    sender, EventArgs e) +95
    System.Web.UI.Control.OnDataBinding(EventArgs e) +66
    System.Web.UI.Control.DataBind() +26
    System.Web.UI.Control.DataBind() +86
    System.Web.UI.WebControls.DataGrid.CreateItem(Int32 itemIndex,
    Int32 dataSourceIndex, ListItemType itemType, Boolean dataBind, Object
    dataItem, DataGridColumn[] columns, TableRowCollection rows,
    PagedDataSource pagedDataSource) +169
    System.Web.UI.WebControls.DataGrid.CreateControlHierarchy(Boolean
    useDataSource) +1408
    System.Web.UI.WebControls.BaseDataList.OnDataBinding(EventArgs e)
    +49
    System.Web.UI.WebControls.BaseDataList.DataBind() +23
    ASP.test7_aspx.__Render__control1(HtmlTextWriter __output, Control
    parameterContainer) in C:\Inetpub\wwwroot\test\test7.aspx:85
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +27
    System.Web.UI.Control.Render(HtmlTextWriter writer) +7
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
    System.Web.UI.Page.ProcessRequestMain() +1929



    I'm assuming (but can't be sure) that this error message is because
    the datagrid doesn't know how to bind the custom collection or objects
    to its required datastructure. If this is the case I'd appreciate some
    advice on how to do this.

    If not, then any other help/explanation would be much appreciated.

    To elaborate further, the data in question is being retrieved from an
    Object Database. Object databases can store the objects in their own
    "collections" called sets which provide their own iterators, search,
    indexing etcetera. Hence I do not wish to use Collectionbase since
    this would require copying the OODB sets into the innerList (the sets
    are rather large). Really all I want is a wrapper (and adapter
    pattern) that presents these sets as a collection that can be bound to
    the datagrid, eg, implementing a custome collection using ICollection,
    IList and IEnumerable, but calling the OODB methods for iteration,
    indexing etc.

    And it must be capably of binding to a datagrid control.

    One more thing. At present the implementation is in Managed C++,
    (because the OODB API is C++), but solutions in C# are acceptable if
    there is no Managed C++ approach that will work.

    thanks in advance

    Rachel
     
    Rachel Koktava, Sep 1, 2003
    #1
    1. Advertising

  2. Rachel Koktava

    Ross Donald Guest

    Hi,

    As I understand it, the Web DataGrid only supports simple databinding
    (through IEnumerable) so when you bind to a custom object it just uses
    IEnumerable to get the next object in the collection then uses reflection to
    get the value of the property that you have bound. The DataGrid should be
    able to deal with null values for the properties.

    Does your collection is implement ITypedList or the individual business
    objects implement ICustomTypeDescriptor?

    There is a KB article (number 316672) that talks about how to handle null
    values in a DataGrid Web Control but it is not very helpful.

    --
    Ross Donald
    Rad Software
    http://www.radsoftware.com.au/web/WebLog/

    "Rachel Koktava" <> wrote in message
    news:...
    > Hi
    >
    > I'm having difficulty bind a collection of custom objects to a
    > datagrid. For reasons that I'll explain shortly I can't use
    > Collectionbase, so have instead implemented a custom collection with
    > the interfaces IList, ICollection and IEnumerable.
    >
    > This class works find for indexing or iterating (foreach etc), but
    > when set as the datasource for a web datagrid control it throws an
    > exception on callinging the datagrids DataBind() method:
    >
    > [ArgumentNullException: Value cannot be null.
    > Parameter name: component]
    > System.ComponentModel.TypeDescriptor.GetProperties(Object
    > component, Boolean noCustomTypeDesc) +173
    > System.ComponentModel.TypeDescriptor.GetProperties(Object
    > component) +7
    > System.Web.UI.WebControls.BoundColumn.OnDataBindColumn(Object
    > sender, EventArgs e) +95
    > System.Web.UI.Control.OnDataBinding(EventArgs e) +66
    > System.Web.UI.Control.DataBind() +26
    > System.Web.UI.Control.DataBind() +86
    > System.Web.UI.WebControls.DataGrid.CreateItem(Int32 itemIndex,
    > Int32 dataSourceIndex, ListItemType itemType, Boolean dataBind, Object
    > dataItem, DataGridColumn[] columns, TableRowCollection rows,
    > PagedDataSource pagedDataSource) +169
    > System.Web.UI.WebControls.DataGrid.CreateControlHierarchy(Boolean
    > useDataSource) +1408
    > System.Web.UI.WebControls.BaseDataList.OnDataBinding(EventArgs e)
    > +49
    > System.Web.UI.WebControls.BaseDataList.DataBind() +23
    > ASP.test7_aspx.__Render__control1(HtmlTextWriter __output, Control
    > parameterContainer) in C:\Inetpub\wwwroot\test\test7.aspx:85
    > System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +27
    > System.Web.UI.Control.Render(HtmlTextWriter writer) +7
    > System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
    > System.Web.UI.Page.ProcessRequestMain() +1929
    >
    >
    >
    > I'm assuming (but can't be sure) that this error message is because
    > the datagrid doesn't know how to bind the custom collection or objects
    > to its required datastructure. If this is the case I'd appreciate some
    > advice on how to do this.
    >
    > If not, then any other help/explanation would be much appreciated.
    >
    > To elaborate further, the data in question is being retrieved from an
    > Object Database. Object databases can store the objects in their own
    > "collections" called sets which provide their own iterators, search,
    > indexing etcetera. Hence I do not wish to use Collectionbase since
    > this would require copying the OODB sets into the innerList (the sets
    > are rather large). Really all I want is a wrapper (and adapter
    > pattern) that presents these sets as a collection that can be bound to
    > the datagrid, eg, implementing a custome collection using ICollection,
    > IList and IEnumerable, but calling the OODB methods for iteration,
    > indexing etc.
    >
    > And it must be capably of binding to a datagrid control.
    >
    > One more thing. At present the implementation is in Managed C++,
    > (because the OODB API is C++), but solutions in C# are acceptable if
    > there is no Managed C++ approach that will work.
    >
    > thanks in advance
    >
    > Rachel
     
    Ross Donald, Sep 2, 2003
    #2
    1. Advertising

  3. Hi

    In follow up to my previous posting it would seem that you don't need
    to implement ITypedList. In fact a Managed C++ class that implements
    IList, ICollection and IEnumerable doesn't need to do anything to bind
    to a datagrid. The exception was caused by the mechanism that a
    datagrid uses to bind to the collection.

    Under the covers it would seem that the datagrid doesn't extract data
    by using the Enumerator and walking the collection, but by using the
    indexer e.g something line

    for(int i=0; i < myCollection.Count; i++
    {
    datagrid[j]=myCollection;
    }

    because I was using the collection to represent an OO extent, I'd
    defined the indexer (using
    [System::Reflection::DefaultMemberAttribute]) to map to the extend
    index for fast look ups. Hence the datagrid couldn't bind because it
    would start doing the for loop and fail on i=0;

    I've posted this in case it may help someone in the future.

    regards
    Rachel
     
    Rachel Koktava, Sep 15, 2003
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    3
    Views:
    922
    Natty Gur
    Nov 3, 2003
  2. Steve Mauldin
    Replies:
    0
    Views:
    374
    Steve Mauldin
    Aug 27, 2004
  3. Vadivel Kumar

    Performance of CollectionBase class

    Vadivel Kumar, Feb 15, 2005, in forum: ASP .Net
    Replies:
    4
    Views:
    1,505
    Vadivel Kumar
    Feb 17, 2005
  4. Web Team @ Borough of Poole

    Returning CollectionBase from WebService

    Web Team @ Borough of Poole, Apr 27, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    1,305
    Web Team @ Borough of Poole
    Apr 27, 2005
  5. JcFx
    Replies:
    0
    Views:
    281
Loading...

Share This Page