J'essaie de créer un contrôle de source de données personnalisé. J'ai suivi this article à la lettre (je pense ...).Hériter de DataSourceControl ne génère pas de IDataSource
J'ai un squelette/mise en œuvre de base de ma source de données, mais quand je le déclare dans le balisage et essayer de lier statiquement à un gridview, je reçois l'erreur suivante:
The DataSourceID of 'grdVw' must be the ID of a control of type IDataSource
Cela semble très étrange pour moi, puisque ma source de données hérite de DataSourceControl, qui à son tour implémente IDataSource. Même si j'implémente explicitement IDataSource dans ma source de données personnalisée, cela ne fait aucune différence.
Mon Markup est:
<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>
Et mon contrôle est:
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
Toute aide ou suggestions seront très appréciés.
suite ...
Au vu de la trace de la pile indique que l'erreur provient de: System.Web.UI.WebControls.DataBoundControl.GetDataSource().
J'ai examiné cette méthode dans le réflecteur (voir ci-dessous), en regardant ce (basé sur le message d'erreur que je reçois) il me semble que si le FindControl partie est RÉUSSIR mais que la source = contrôle comme IDataSource; laisse source comme une valeur nulle, c'est-à-dire que la conversion échoue - mais pourquoi?
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;
}
Qu'est-ce que DataBrokerDataSource? Votre DataSource est CustomDataSource – epitka
Ah! - J'ai modifié le code pour le poste dans une tentative de clarté qui a conduit à l'obfuscation accidentelle – RobD
Pardonnez mon ignorance, mais je n'ai jamais vu tag pour le contrôle sans préfixe tag. – epitka