Наследование от 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 ответ
Спасибо, эпитка, проблема была вызвана тем, что элемент управления не был правильно зарегистрирован на странице.