Я пытаюсь создать пользовательский элемент управления источником данных.
Я следил за эту статью до письма (я думаю ...).
У меня есть скелетная / базовая реализация моего источника данных, однако, когда я объявляю его в разметке и пытаюсь статически связать его с 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;
}