Наследование от DataSourceControl не создает IDataSource - PullRequest
0 голосов
/ 15 февраля 2010

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

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

У меня есть скелетная / базовая реализация моего источника данных, однако, когда я объявляю его в разметке и пытаюсь статически связать его с 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 успешно выполняется, но что 1033 * source = контроль как IDataSource; оставляет source в качестве нулевого значения, т. Е. Преобразование не выполняется - но почему?

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 Ответ

0 голосов
/ 24 февраля 2010

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

...