Наследование от DataSourceControl не создает IDataSource

Я пытаюсь создать пользовательский элемент управления источником данных.

Я следил за этой статьей к письму (я думаю...).

У меня есть скелетная / базовая реализация моего источника данных, однако, когда я объявляю его в разметке и пытаюсь статически связать его с gridview, я получаю следующую ошибку:

DataSourceID 'grdVw' должен быть идентификатором элемента управления типа IDataSource

Это кажется мне чрезвычайно странным, поскольку мой источник данных наследуется от DataSourceControl, который, в свою очередь, реализует IDataSource. Даже если я явно реализую IDataSource в моем собственном источнике данных, это не имеет значения.

Моя разметка это:

<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>

И мой контроль:

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

Любая помощь или предложения будут очень благодарны.

Продолжение...

Просмотр трассировки стека показывает, что ошибка происходит по адресу: System.Web.UI.WebControls.DataBoundControl.GetDataSource ().

Я проверил этот метод в отражателе (см. Ниже), глядя на это (основываясь на полученном сообщении об ошибке), мне кажется, что часть FindControl выполняется успешно, но что source = control is IDataSource; оставляет источник как нулевое значение, т.е. преобразование завершается неудачно - но почему?

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;
}

1 ответ

Решение

Спасибо, эпитка, проблема была вызвана тем, что элемент управления не был правильно зарегистрирован на странице.

Другие вопросы по тегам