Implementazione di una finestra di progettazione per controlli Web Form associati a dati
Lo scopo principale di una finestra di progettazione per controlli associati a dati è consentire l'accesso da parte del controllo a un'origine dati diversa (di esempio) in fase di progettazione quando il controllo si trova nella finestra di progettazione. In .NET Framework è disponibile l'interfaccia IDataSourceProvider che specifica il contratto per l'accesso a un'origine dati. Una finestra di progettazione per un controllo server associato a dati deve implementare l'interfaccia IDataSourceProvider ed eseguire gli altri passaggi descritti nella seguente procedura.
Per implementare una finestra di progettazione per controlli associati a dati
Nota Nei passaggi riportati di seguito viene descritta l'implementazione specifica dell'esempio di finestra di progettazione per controlli Web Form associati a dati e basati su modelli. È possibile applicare questa implementazione a un controllo con un'origine dati di tipo oggetto che accetta un riferimento a IEnumerable.
Definire una classe che derivi direttamente o indirettamente da ControlDesigner e che implementi l'interfaccia IDataSourceProvider, come mostrato nel frammento di codice seguente.
Public Class DataboundControlDesigner Inherits ControlDesigner Implements IDataSourceProvider ... End Class [C#] public class DataboundControlDesigner : ControlDesigner, IDataSourceProvider {...}
Esporre una proprietà di tipo stringa denominata DataSource che specifica l'origine dati della fase di progettazione. Per un esempio di implementazione di questa proprietà, vedere Esempio di finestra di progettazione per controlli Web Form associati a dati e basati su modelli. La proprietà DataSource della finestra di progettazione funziona basandosi sull'insieme DataBindings del controllo.
Eseguire l'override del metodo GetDesignTimeHtml e impostare l'origine dati del controllo, che è associata alla finestra di progettazione, all'origine dati in fase di progettazione. Per un esempio di override di questo metodo per la sostituzione dell'origine dati, vedere Esempio di finestra di progettazione per controlli Web Form associati a dati e basati su modelli.
Eseguire l'override del metodo PreFilterProperties per sostituire o nascondere il valore della roprietà DataSource nel controllo con la proprietà DataSource in fase di progettazione. Il metodo PreFilterProperties appartiene all'interfaccia IDesignerFilter, che consente alla finestra di progettazione di sostituire o creare proprietà ed eventi in fase di progettazione. IDesignerFilter viene implementata da ControlDesigner. Per ulteriori informazioni sull'applicazione di filtri alle proprietà, vedere Filtro di metadati. Nel frammento di codice seguente viene illustrato l'override del metodo PreFilterProperties.
Protected Overrides Sub PreFilterProperties(properties As IDictionary) MyBase.PreFilterProperties(properties) Dim prop As PropertyDescriptor prop = CType(properties("DataSource"), PropertyDescriptor) Debug.Assert(( Not (prop Is Nothing))) prop = TypeDescriptor.CreateProperty(Me.GetType(), prop, _ New Attribute() {New TypeConverterAttribute(GetType(DataSourceConverter))}) properties("DataSource") = prop End Sub [C#] protected override void PreFilterProperties(IDictionary properties) { base.PreFilterProperties(properties); PropertyDescriptor prop; prop = (PropertyDescriptor)properties["DataSource"]; Debug.Assert(prop != null); prop = TypeDescriptor.CreateProperty(this.GetType(), prop, new Attribute[] { new TypeConverterAttribute(typeof(DataSourceConverter)) }); properties["DataSource"] = prop; }
Implementare i metodi dell'interfaccia IDataSourceProvider. Questa interfaccia dispone di due metodi: GetResolvedSelectedDataSource e GetSelectedDataSource. Nell'esempio di codice seguente viene illustrata l'implementazione di questi metodi nell'esempio di finestra di progettazione per controlli Web Form associati a dati e basati su modelli.
Function GetResolvedSelectedDataSource() As IEnumerable Implements IDataSourceProvider.GetResolvedSelectedDataSource Return CType(CType(Me, IDataSourceProvider).GetSelectedDataSource(), IEnumerable) End Function Function GetSelectedDataSource() As Object Implements IDataSourceProvider.GetSelectedDataSource Dim selectedDataSource As Object = Nothing Dim dataSource As String = Nothing Dim binding As DataBinding = DataBindings("DataSource") If Not (binding Is Nothing) Then dataSource = binding.Expression End If If Not (dataSource Is Nothing) Then Dim componentSite As ISite = Component.Site If Not (componentSite Is Nothing) Then Dim container As IContainer = CType(componentSite.GetService(GetType(IContainer)), IContainer) If Not (container Is Nothing) Then Dim comp As IComponent = container.Components(dataSource) If TypeOf comp Is IEnumerable Then selectedDataSource = comp End If End If End If End If Return selectedDataSource End Function [C#] IEnumerable IDataSourceProvider.GetResolvedSelectedDataSource() { return (IEnumerable)((IDataSourceProvider)this).GetSelectedDataSource(); } object IDataSourceProvider.GetSelectedDataSource() { object selectedDataSource = null; string dataSource = null; DataBinding binding = DataBindings["DataSource"]; if (binding != null) { dataSource = binding.Expression; } if (dataSource != null) { ISite componentSite = Component.Site; if (componentSite != null) { IContainer container = (IContainer)componentSite.GetService(typeof(IContainer)); if (container != null) { IComponent comp = container.Components[dataSource]; if (comp is IEnumerable) { selectedDataSource = comp; } } } } return selectedDataSource; }
Per un esempio completo contente i passaggi sopra descritti, vedere Esempio di finestra di progettazione per controlli Web Form associati a dati e basati su modelli.
Vedere anche
Esempio di finestra di progettazione per controlli Web Form associati a dati e basati su modelli | Implementazione di un editor di modelli Web Form | Finestre di progettazione personalizzate | Supporto in fase di progettazione per Web Form