[Mono-dev] PagedDataSource and DataTable (IListSource) DataSource

Matt Petteys mpetteys at yellowguppy.com
Sun Dec 4 12:16:49 EST 2005

I have a datagrid in an form which has the DataSource set with a 
System.Data.DataTable.  On the MS runtime the datagrid, successfully 
databinds and displays the data.

On Mono, it fails with the error..

<0x00175> System.Web.UI.WebControls.PagedDataSource:get_DataSourceCount 
() in <0x00034> System.Web.UI.WebControls.PagedDataSource:get_PageCount 
() in <0x000ce> 
(System.Web.UI.WebControls.DataGridItem item, Int32 columnSpan, 
System.Web.UI.WebControls.PagedDataSource paged) in <0x00051> 
(System.Web.UI.WebControls.DataGridItem item, Int32 columnSpan, 
System.Web.UI.WebControls.PagedDataSource pagedDataSource) in <0x000a7> 
System.Web.UI.WebControls.DataGrid:CreateItem (Int32 item_index, Int32 
data_source_index, ListItemType type, Boolean data_bind, System.Object 
data_item, System.Web.UI.WebControls.PagedDataSource paged) in <0x00273> 
System.Web.UI.WebControls.DataGrid:CreateControlHierarchy (Boolean 
useDataSource) in <0x00095> 
System.Web.UI.WebControls.BaseDataList:DataBind ()

The datagrid definition is..

<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" 
PageSize="20" AllowPaging="True" CssClass="datatable">
<PagerStyle Mode="NumericPages">

The error generated on the webform is..

*Error Message: *HTTP 500. The data source must implement ICollection

This error appears to maps back to 

public int DataSourceCount {
get {
if (source == null)
 return 0;
if (IsCustomPagingEnabled)
 return virtual_count;

if (source is ICollection)
 return ((ICollection) source).Count;

throw new HttpException ("The data source must implement ICollection");

Since a DataTable doesn't implement ICollection directely it appears to 
be causing the problem?  Should something like the following be added to 
the DataSourceCount method before the error is thrown?

if (source is IListSource) {
 return ((ICollection) ((IListSource)source).GetList() ).Count;

Additionally, the GetEnumerator method doesn't appear to anticipate a DataTable or IListSource object.  Something like the following might be appropriate.

public IEnumerator GetEnumerator ()

// IList goes first, as it implements ICollection
> IList list
> if (source is IListSource) {
>  list = ((IListSource) source).GetList();
> else {
>   list = source as IList;
> }

int first = 0;
int count;
int limit;
if (list != null) {
first = FirstIndexInPage;
count = ((ICollection) source).Count;
limit = ((first + page_size) > count) ? (count - first) : page_size;
return GetListEnum (list, first, first + limit);

ICollection col = source as ICollection;
if (col != null) {
first = FirstIndexInPage;
count = col.Count;
limit = ((first + page_size) > count) ? (count - first) : page_size;
return GetEnumeratorEnum (col.GetEnumerator (), first, first + page_size);

return source.GetEnumerator ();

If this makes sense then I can submit the appropriate bug.

Matt Petteys

More information about the Mono-devel-list mailing list