Condividi tramite


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.

  1. 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 {...}
    
  2. 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.

  3. 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.

  4. 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;
            }
    
  5. 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