views:

153

answers:

1

I am trying to create a custom datasource control.

I have been following this article to the letter (I think...).

I have a skeleton / basic implementation of my datasource, however when I declare it in the markup and try to statically bind it to a gridview, I receive the following error:

The DataSourceID of 'grdVw' must be the ID of a control of type IDataSource

This seems extremely strange to me, since my datasource inherits from DataSourceControl, which in turn implements IDataSource. Even if I explicitly implement IDataSource in my custom datasource, it makes no difference.

My Markup is:

<DataBrokerDataSource  ID="objSrcDBroker" runat="server" />

<div>
    <asp:GridView ID="grdVw" DataSourceID="objSrcDBroker" DataMember="Table0" runat="server">
    </asp:GridView>
</div>

<div>
    <asp:GridView id="grdVw2" DataSourceID="objSrcDBroker" DataMember="Table1" runat="server">
    </asp:GridView>
</div>

And my control is:

Public Class DataBrokerDataSource
    Inherits DataSourceControl
    Implements IDataSource  'Have tried with this statement included AND excluded = same result

    Protected Overrides Function GetView(ByVal viewName As String) As System.Web.UI.DataSourceView Implements IDataSource.GetView
        'Code here
    End Function

    Protected Overrides Function GetViewNames() As System.Collections.ICollection Implements IDataSource.GetViewNames
        'Code here
    End Function

End Class

Any help or suggestions will be very much appreciated.

Continued...

Looking at the stack trace shows that the error originates at: System.Web.UI.WebControls.DataBoundControl.GetDataSource().

I have examined this method in reflector (see below), looking at this (based on the error message that I am getting) it appears to me as though the FindControl part is succeeding but that the source = control as IDataSource; leaves source as a null value, i.e. the conversion fails - But Why?

protected virtual IDataSource GetDataSource()
{
    if ((!base.DesignMode && this._currentDataSourceValid) && (this._currentDataSource != null))
    {
        return this._currentDataSource;
    }
    IDataSource source = null;
    string dataSourceID = this.DataSourceID;
    if (dataSourceID.Length != 0)
    {
        Control control = DataBoundControlHelper.FindControl(this, dataSourceID);
        if (control == null)
        {
            throw new HttpException(SR.GetString("DataControl_DataSourceDoesntExist", new object[] { this.ID, dataSourceID }));
        }
        source = control as IDataSource;
        if (source == null)
        {
            throw new HttpException(SR.GetString("DataControl_DataSourceIDMustBeDataControl", new object[] { this.ID, dataSourceID }));
        }
    }
    return source;
}
A: 

Thank you epitka, the problem was caused by the control not being registered on the page correctly.

RobD